Index: pkg/analyzer/lib/src/generated/element.dart |
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart |
index 56c1f2563c76002a30a51ac90b429373e24944f6..4bdfea054d549f201673cc1f320230ea08798aa3 100644 |
--- a/pkg/analyzer/lib/src/generated/element.dart |
+++ b/pkg/analyzer/lib/src/generated/element.dart |
@@ -5076,9 +5076,22 @@ class FunctionTypeImpl extends TypeImpl implements FunctionType { |
// variables, and see if the result is equal. |
if (boundTypeParameters.isNotEmpty) { |
List<DartType> instantiateTypeArgs = new List<DartType>(); |
- for (TypeParameterElement e in boundTypeParameters) { |
- instantiateTypeArgs.add(new TypeParameterTypeImpl( |
- new TypeParameterElementImpl(e.name, -1))); |
+ List<DartType> variablesThis = new List<DartType>(); |
+ List<DartType> variablesOther = new List<DartType>(); |
+ for (int i = 0; i < boundTypeParameters.length; i++) { |
+ TypeParameterElement pThis = boundTypeParameters[i]; |
+ TypeParameterElement pOther = otherType.boundTypeParameters[i]; |
+ TypeParameterTypeImpl pFresh = new TypeParameterTypeImpl( |
+ new TypeParameterElementImpl(pThis.name, -1)); |
+ instantiateTypeArgs.add(pFresh); |
+ variablesThis.add(pThis.type); |
+ variablesOther.add(pOther.type); |
+ // Check that the bounds are equal after equating the previous |
+ // bound variables. |
+ if (pThis.bound?.substitute2(instantiateTypeArgs, variablesThis) != |
+ pOther.bound?.substitute2(instantiateTypeArgs, variablesOther)) { |
+ return false; |
+ } |
} |
// After instantiation, they will no longer have boundTypeParameters, |
// so we will continue below. |
@@ -5110,6 +5123,7 @@ class FunctionTypeImpl extends TypeImpl implements FunctionType { |
} |
List<DartType> instantiateTypeArgs = new List<DartType>(); |
+ List<DartType> variables = new List<DartType>(); |
buffer.write("<"); |
for (TypeParameterElement e in boundTypeParameters) { |
if (e != boundTypeParameters[0]) { |
@@ -5130,6 +5144,13 @@ class FunctionTypeImpl extends TypeImpl implements FunctionType { |
new TypeParameterTypeImpl(new TypeParameterElementImpl(name, -1)); |
t.appendTo(buffer); |
instantiateTypeArgs.add(t); |
+ variables.add(e.type); |
+ if (e.bound != null) { |
+ buffer.write(" extends "); |
+ TypeImpl renamed = |
+ e.bound.substitute2(instantiateTypeArgs, variables); |
+ renamed.appendTo(buffer); |
+ } |
} |
buffer.write(">"); |