Index: pkg/analyzer/lib/src/dart/element/element.dart |
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart |
index 58e3d96b370a3d5bf567f3bcc023871e9f67d4dc..8d239d4997011c57f63d8f63a4a17ef420ae9ed7 100644 |
--- a/pkg/analyzer/lib/src/dart/element/element.dart |
+++ b/pkg/analyzer/lib/src/dart/element/element.dart |
@@ -724,7 +724,7 @@ class ClassElementImpl extends AbstractClassElementImpl |
if (_unlinkedClass != null && _interfaces == null) { |
ResynthesizerContext context = enclosingUnit.resynthesizerContext; |
_interfaces = _unlinkedClass.interfaces |
- .map((EntityRef t) => context.resolveTypeRef(this, t)) |
+ .map((EntityRef t) => context.resolveTypeRef(t, this)) |
.where(_isClassInterfaceType) |
.toList(growable: false); |
} |
@@ -831,7 +831,7 @@ class ClassElementImpl extends AbstractClassElementImpl |
if (_unlinkedClass != null && _mixins == null) { |
ResynthesizerContext context = enclosingUnit.resynthesizerContext; |
_mixins = _unlinkedClass.mixins |
- .map((EntityRef t) => context.resolveTypeRef(this, t)) |
+ .map((EntityRef t) => context.resolveTypeRef(t, this)) |
.where(_isClassInterfaceType) |
.toList(growable: false); |
} |
@@ -865,7 +865,7 @@ class ClassElementImpl extends AbstractClassElementImpl |
if (_unlinkedClass != null && _supertype == null) { |
if (_unlinkedClass.supertype != null) { |
DartType type = enclosingUnit.resynthesizerContext |
- .resolveTypeRef(this, _unlinkedClass.supertype); |
+ .resolveTypeRef(_unlinkedClass.supertype, this); |
if (_isClassInterfaceType(type)) { |
_supertype = type; |
} else { |
@@ -3879,10 +3879,10 @@ abstract class ExecutableElementImpl extends ElementImpl |
_returnType == null) { |
bool isSetter = |
serializedExecutable.kind == UnlinkedExecutableKind.setter; |
- _returnType = enclosingUnit.resynthesizerContext |
- .resolveLinkedType(this, serializedExecutable.inferredReturnTypeSlot); |
+ _returnType = enclosingUnit.resynthesizerContext.resolveLinkedType( |
+ serializedExecutable.inferredReturnTypeSlot, typeParameterContext); |
_declaredReturnType = enclosingUnit.resynthesizerContext.resolveTypeRef( |
- this, serializedExecutable.returnType, |
+ serializedExecutable.returnType, typeParameterContext, |
defaultVoid: isSetter && context.analysisOptions.strongMode, |
declaredType: true); |
} |
@@ -4572,7 +4572,7 @@ class FunctionElementImpl_forLUB extends FunctionElementImpl { |
@override |
DartType get returnType { |
return _returnType ??= enclosingUnit.resynthesizerContext |
- .resolveTypeRef(this, _entityRef.syntheticReturnType); |
+ .resolveTypeRef(_entityRef.syntheticReturnType, typeParameterContext); |
} |
@override |
@@ -4736,7 +4736,7 @@ class FunctionTypeAliasElementImpl extends ElementImpl |
DartType get returnType { |
if (_unlinkedTypedef != null && _returnType == null) { |
_returnType = enclosingUnit.resynthesizerContext.resolveTypeRef( |
- this, _unlinkedTypedef.returnType, |
+ _unlinkedTypedef.returnType, this, |
declaredType: true); |
} |
return _returnType; |
@@ -4859,6 +4859,11 @@ class GenericFunctionTypeElementImpl extends ElementImpl |
EntityRef _entityRef; |
/** |
+ * The enclosing type parameter context. |
+ */ |
+ TypeParameterizedElementMixin _typeParameterContext; |
+ |
+ /** |
* The declared return type of the function. |
*/ |
DartType _returnType; |
@@ -4884,13 +4889,13 @@ class GenericFunctionTypeElementImpl extends ElementImpl |
* Initialize from serialized information. |
*/ |
GenericFunctionTypeElementImpl.forSerialized( |
- ElementImpl enclosingElement, this._entityRef) |
- : super.forSerialized(enclosingElement); |
+ this._entityRef, this._typeParameterContext) |
+ : super.forSerialized(null); |
@override |
- TypeParameterizedElementMixin get enclosingTypeParameterContext { |
- return _enclosingElement.typeParameterContext; |
- } |
+ TypeParameterizedElementMixin get enclosingTypeParameterContext => |
+ _typeParameterContext ?? |
+ (enclosingElement as ElementImpl).typeParameterContext; |
@override |
String get identifier => '-'; |
@@ -4923,7 +4928,7 @@ class GenericFunctionTypeElementImpl extends ElementImpl |
DartType get returnType { |
if (_entityRef != null && _returnType == null) { |
_returnType = enclosingUnit.resynthesizerContext.resolveTypeRef( |
- this, _entityRef.syntheticReturnType, |
+ _entityRef.syntheticReturnType, typeParameterContext, |
defaultVoid: false, declaredType: true); |
} |
return _returnType; |
@@ -5097,7 +5102,7 @@ class GenericTypeAliasElementImpl extends ElementImpl |
GenericFunctionTypeElement get function { |
if (_function == null && _unlinkedTypedef != null) { |
DartType type = enclosingUnit.resynthesizerContext.resolveTypeRef( |
- this, _unlinkedTypedef.returnType, |
+ _unlinkedTypedef.returnType, this, |
declaredType: true); |
if (type is FunctionType) { |
Element element = type.element; |
@@ -7275,10 +7280,11 @@ abstract class NonParameterVariableElementImpl extends VariableElementImpl { |
@override |
DartType get type { |
if (_unlinkedVariable != null && _declaredType == null && _type == null) { |
- _type = enclosingUnit.resynthesizerContext |
- .resolveLinkedType(this, _unlinkedVariable.inferredTypeSlot); |
- declaredType = enclosingUnit.resynthesizerContext |
- .resolveTypeRef(this, _unlinkedVariable.type, declaredType: true); |
+ _type = enclosingUnit.resynthesizerContext.resolveLinkedType( |
+ _unlinkedVariable.inferredTypeSlot, typeParameterContext); |
+ declaredType = enclosingUnit.resynthesizerContext.resolveTypeRef( |
+ _unlinkedVariable.type, typeParameterContext, |
+ declaredType: true); |
} |
return super.type; |
} |
@@ -7780,17 +7786,18 @@ class ParameterElementImpl extends VariableElementImpl |
parameterTypeElement.shareParameters(subParameters); |
} |
parameterTypeElement.returnType = enclosingUnit.resynthesizerContext |
- .resolveTypeRef(this, _unlinkedParam.type); |
+ .resolveTypeRef(_unlinkedParam.type, typeParameterContext); |
FunctionTypeImpl parameterType = |
new FunctionTypeImpl.elementWithNameAndArgs(parameterTypeElement, |
null, typeParameterContext.allTypeParameterTypes, false); |
parameterTypeElement.type = parameterType; |
_type = parameterType; |
} else { |
- _type = enclosingUnit.resynthesizerContext |
- .resolveLinkedType(this, _unlinkedParam.inferredTypeSlot); |
- declaredType = enclosingUnit.resynthesizerContext |
- .resolveTypeRef(this, _unlinkedParam.type, declaredType: true); |
+ _type = enclosingUnit.resynthesizerContext.resolveLinkedType( |
+ _unlinkedParam.inferredTypeSlot, typeParameterContext); |
+ declaredType = enclosingUnit.resynthesizerContext.resolveTypeRef( |
+ _unlinkedParam.type, typeParameterContext, |
+ declaredType: true); |
} |
} |
} |
@@ -8287,8 +8294,8 @@ abstract class PropertyInducingElementImpl |
@override |
DartType get propagatedType { |
if (_unlinkedVariable != null && _propagatedType == null) { |
- _propagatedType = enclosingUnit.resynthesizerContext |
- .resolveLinkedType(this, _unlinkedVariable.propagatedTypeSlot); |
+ _propagatedType = enclosingUnit.resynthesizerContext.resolveLinkedType( |
+ _unlinkedVariable.propagatedTypeSlot, typeParameterContext); |
} |
return _propagatedType; |
} |
@@ -8363,13 +8370,14 @@ abstract class ResynthesizerContext { |
* unresolved, return `null`. |
*/ |
ConstructorElement resolveConstructorRef( |
- ElementImpl context, EntityRef entry); |
+ TypeParameterizedElementMixin typeParameterContext, EntityRef entry); |
/** |
* Build the appropriate [DartType] object corresponding to a slot id in the |
* [LinkedUnit.types] table. |
*/ |
- DartType resolveLinkedType(ElementImpl context, int slot); |
+ DartType resolveLinkedType( |
+ int slot, TypeParameterizedElementMixin typeParameterContext); |
/** |
* Resolve an [EntityRef] into a type. If the reference is |
@@ -8378,7 +8386,8 @@ abstract class ResynthesizerContext { |
* TODO(paulberry): or should we have a class representing an |
* unresolved type, for consistency with the full element model? |
*/ |
- DartType resolveTypeRef(ElementImpl context, EntityRef type, |
+ DartType resolveTypeRef( |
+ EntityRef type, TypeParameterizedElementMixin typeParameterContext, |
{bool defaultVoid: false, |
bool instantiateToBoundsAllowed: true, |
bool declaredType: false}); |
@@ -8580,7 +8589,7 @@ class TypeParameterElementImpl extends ElementImpl |
return null; |
} |
return _bound ??= enclosingUnit.resynthesizerContext.resolveTypeRef( |
- this, _unlinkedTypeParam.bound, |
+ _unlinkedTypeParam.bound, enclosingElement, |
instantiateToBoundsAllowed: false, declaredType: true); |
} |
return _bound; |