Chromium Code Reviews| Index: pkg/analyzer/lib/src/summary/link.dart |
| diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart |
| index 7c4ff3d1e40b3fc46380622905232d870bc8113b..b8946cf7299d80c7837ee8449293ace300e8d5b4 100644 |
| --- a/pkg/analyzer/lib/src/summary/link.dart |
| +++ b/pkg/analyzer/lib/src/summary/link.dart |
| @@ -160,7 +160,7 @@ Map<String, LinkedLibraryBuilder> setupForLink( |
| EntityRefBuilder _createLinkedType( |
| DartType type, |
| CompilationUnitElementInBuildUnit compilationUnit, |
| - TypeParameterizedElementForLink typeParameterContext, |
| + TypeParameterizedElementMixin typeParameterContext, |
| {int slot}) { |
| EntityRefBuilder result = new EntityRefBuilder(slot: slot); |
| if (type is InterfaceType) { |
| @@ -179,7 +179,7 @@ EntityRefBuilder _createLinkedType( |
| result.reference = compilationUnit.addRawReference('*bottom*'); |
| return result; |
| } else if (type is TypeParameterType) { |
| - TypeParameterElementForLink element = type.element; |
| + TypeParameterElementImpl element = type.element; |
| if (typeParameterContext.isTypeParameterInScope(element)) { |
| result.paramReference = |
| typeParameterContext.typeParameterNestingLevel - element.nestingLevel; |
| @@ -251,7 +251,7 @@ EntityRefBuilder _createLinkedType( |
| UnlinkedParamBuilder _serializeSyntheticParam( |
| ParameterElement parameter, |
| CompilationUnitElementInBuildUnit compilationUnit, |
| - TypeParameterizedElementForLink typeParameterContext) { |
| + TypeParameterizedElementMixin typeParameterContext) { |
| UnlinkedParamBuilder b = new UnlinkedParamBuilder(); |
| b.name = parameter.name; |
| switch (parameter.parameterKind) { |
| @@ -290,7 +290,7 @@ void _storeTypeArguments( |
| List<DartType> typeArguments, |
| EntityRefBuilder encodedType, |
| CompilationUnitElementInBuildUnit compilationUnit, |
| - TypeParameterizedElementForLink typeParameterContext) { |
| + TypeParameterizedElementMixin typeParameterContext) { |
| int count = typeArguments.length; |
| List<EntityRefBuilder> encodedTypeArguments = |
| new List<EntityRefBuilder>(count); |
| @@ -363,6 +363,9 @@ abstract class ClassElementForLink extends Object |
| String get name; |
| @override |
| + ResynthesizerContext get resynthesizerContext => enclosingElement; |
| + |
| + @override |
| ConstructorElementForLink get unnamedConstructor; |
| @override |
| @@ -403,7 +406,7 @@ abstract class ClassElementForLink extends Object |
| * linking. |
| */ |
| class ClassElementForLink_Class extends ClassElementForLink |
| - with TypeParameterizedElementForLink { |
| + with TypeParameterizedElementMixin { |
| /** |
| * The unlinked representation of the class in the summary. |
| */ |
| @@ -489,7 +492,7 @@ class ClassElementForLink_Class extends ClassElementForLink |
| String get displayName => _unlinkedClass.name; |
| @override |
| - TypeParameterizedElementForLink get enclosingTypeParameterContext => null; |
| + TypeParameterizedElementMixin get enclosingTypeParameterContext => null; |
| @override |
| List<FieldElementForLink_ClassField> get fields { |
| @@ -553,6 +556,10 @@ class ClassElementForLink_Class extends ClassElementForLink |
| _type ??= buildType((int i) => typeParameterTypes[i], null); |
| @override |
| + List<UnlinkedTypeParam> get unlinkedTypeParams => |
| + _unlinkedClass.typeParameters; |
| + |
| + @override |
| ConstructorElementForLink get unnamedConstructor { |
| if (!_unnamedConstructorComputed) { |
| for (ConstructorElementForLink constructor in constructors) { |
| @@ -567,10 +574,6 @@ class ClassElementForLink_Class extends ClassElementForLink |
| } |
| @override |
| - List<UnlinkedTypeParam> get _unlinkedTypeParams => |
| - _unlinkedClass.typeParameters; |
| - |
| - @override |
| DartType buildType( |
| DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) { |
| int numTypeParameters = _unlinkedClass.typeParameters.length; |
| @@ -634,7 +637,7 @@ class ClassElementForLink_Class extends ClassElementForLink |
| */ |
| InterfaceType _computeInterfaceType(EntityRef typeRef) { |
| if (typeRef != null) { |
| - DartType type = enclosingElement._resolveTypeRef(typeRef, this); |
| + DartType type = enclosingElement.resolveTypeRef(typeRef, this); |
| if (type is InterfaceType) { |
| return type; |
| } |
| @@ -744,7 +747,7 @@ class ClassElementForLink_Enum extends ClassElementForLink { |
| * summary during linking. |
| */ |
| abstract class CompilationUnitElementForLink |
| - implements CompilationUnitElementImpl { |
| + implements CompilationUnitElementImpl, ResynthesizerContext { |
| /** |
| * The unlinked representation of the compilation unit in the |
| * summary. |
| @@ -941,11 +944,50 @@ abstract class CompilationUnitElementForLink |
| * given slot, `dynamic` is returned. |
| */ |
| DartType getLinkedType( |
| - int slot, TypeParameterizedElementForLink typeParameterContext); |
| + int slot, TypeParameterizedElementMixin typeParameterContext); |
| @override |
| noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| + /** |
| + * Resolve an [EntityRef] into a type. If the reference is |
| + * unresolved, return [DynamicTypeImpl.instance]. |
| + * |
| + * TODO(paulberry): or should we have a class representing an |
| + * unresolved type, for consistency with the full element model? |
| + */ |
|
Paul Berry
2016/05/17 19:28:02
Nit: remove this comment and add an "@override" an
scheglov
2016/05/17 19:42:21
Done.
|
| + DartType resolveTypeRef( |
| + EntityRef type, TypeParameterizedElementMixin typeParameterContext, |
| + {bool defaultVoid: false, bool instantiateToBoundsAllowed: true}) { |
| + if (type == null) { |
| + if (defaultVoid) { |
| + return VoidTypeImpl.instance; |
| + } else { |
| + return DynamicTypeImpl.instance; |
| + } |
| + } |
| + if (type.paramReference != 0) { |
| + return typeParameterContext.getTypeParameterType(type.paramReference); |
| + } else if (type.syntheticReturnType != null) { |
| + // TODO(paulberry): implement. |
| + throw new UnimplementedError(); |
| + } else if (type.implicitFunctionTypeIndices.isNotEmpty) { |
| + // TODO(paulberry): implement. |
| + throw new UnimplementedError(); |
| + } else { |
| + DartType getTypeArgument(int i) { |
| + if (i < type.typeArguments.length) { |
| + return resolveTypeRef(type.typeArguments[i], typeParameterContext); |
| + } else { |
| + return DynamicTypeImpl.instance; |
| + } |
| + } |
| + ReferenceableElementForLink element = _resolveRef(type.reference); |
| + return element.buildType( |
| + getTypeArgument, type.implicitFunctionTypeIndices); |
| + } |
| + } |
| + |
| @override |
| String toString() => enclosingElement.toString(); |
| @@ -990,45 +1032,6 @@ abstract class CompilationUnitElementForLink |
| } |
| return _references[index]; |
| } |
| - |
| - /** |
| - * Resolve an [EntityRef] into a type. If the reference is |
| - * unresolved, return [DynamicTypeImpl.instance]. |
| - * |
| - * TODO(paulberry): or should we have a class representing an |
| - * unresolved type, for consistency with the full element model? |
| - */ |
| - DartType _resolveTypeRef( |
| - EntityRef type, TypeParameterizedElementForLink typeParameterContext, |
| - {bool defaultVoid: false}) { |
| - if (type == null) { |
| - if (defaultVoid) { |
| - return VoidTypeImpl.instance; |
| - } else { |
| - return DynamicTypeImpl.instance; |
| - } |
| - } |
| - if (type.paramReference != 0) { |
| - return typeParameterContext.getTypeParameterType(type.paramReference); |
| - } else if (type.syntheticReturnType != null) { |
| - // TODO(paulberry): implement. |
| - throw new UnimplementedError(); |
| - } else if (type.implicitFunctionTypeIndices.isNotEmpty) { |
| - // TODO(paulberry): implement. |
| - throw new UnimplementedError(); |
| - } else { |
| - DartType getTypeArgument(int i) { |
| - if (i < type.typeArguments.length) { |
| - return _resolveTypeRef(type.typeArguments[i], typeParameterContext); |
| - } else { |
| - return DynamicTypeImpl.instance; |
| - } |
| - } |
| - ReferenceableElementForLink element = _resolveRef(type.reference); |
| - return element.buildType( |
| - getTypeArgument, type.implicitFunctionTypeIndices); |
| - } |
| - } |
| } |
| /** |
| @@ -1180,7 +1183,7 @@ class CompilationUnitElementInBuildUnit extends CompilationUnitElementForLink { |
| @override |
| DartType getLinkedType( |
| - int slot, TypeParameterizedElementForLink typeParameterContext) { |
| + int slot, TypeParameterizedElementMixin typeParameterContext) { |
| // This method should only be called on compilation units that come from |
| // dependencies, never on compilation units that are part of the current |
| // build unit. |
| @@ -1229,7 +1232,7 @@ class CompilationUnitElementInBuildUnit extends CompilationUnitElementForLink { |
| * unit's linked type list. |
| */ |
| void _storeLinkedType(int slot, DartType linkedType, |
| - TypeParameterizedElementForLink typeParameterContext) { |
| + TypeParameterizedElementMixin typeParameterContext) { |
| if (slot != 0) { |
| if (linkedType != null && !linkedType.isDynamic) { |
| _linkedUnit.types.add(_createLinkedType( |
| @@ -1286,9 +1289,9 @@ class CompilationUnitElementInDependency extends CompilationUnitElementForLink { |
| @override |
| DartType getLinkedType( |
| - int slot, TypeParameterizedElementForLink typeParameterContext) { |
| + int slot, TypeParameterizedElementMixin typeParameterContext) { |
| if (slot < _linkedTypeRefs.length) { |
| - return _resolveTypeRef(_linkedTypeRefs[slot], typeParameterContext); |
| + return resolveTypeRef(_linkedTypeRefs[slot], typeParameterContext); |
| } else { |
| return DynamicTypeImpl.instance; |
| } |
| @@ -1748,7 +1751,7 @@ abstract class DependencyWalker<NodeType extends Node<NodeType>> { |
| * linking. |
| */ |
| abstract class ExecutableElementForLink extends Object |
| - with TypeParameterizedElementForLink, ParameterParentElementForLink |
| + with TypeParameterizedElementMixin, ParameterParentElementForLink |
| implements ExecutableElementImpl { |
| /** |
| * The unlinked representation of the method in the summary. |
| @@ -1782,7 +1785,7 @@ abstract class ExecutableElementForLink extends Object |
| return null; |
| } else { |
| return _declaredReturnType ??= |
| - compilationUnit._resolveTypeRef(_unlinkedExecutable.returnType, this); |
| + compilationUnit.resolveTypeRef(_unlinkedExecutable.returnType, this); |
| } |
| } |
| @@ -1801,7 +1804,7 @@ abstract class ExecutableElementForLink extends Object |
| Element get enclosingElement => enclosingClass ?? compilationUnit; |
| @override |
| - TypeParameterizedElementForLink get enclosingTypeParameterContext => |
| + TypeParameterizedElementMixin get enclosingTypeParameterContext => |
| enclosingClass; |
| @override |
| @@ -1860,6 +1863,9 @@ abstract class ExecutableElementForLink extends Object |
| } |
| @override |
| + ResynthesizerContext get resynthesizerContext => compilationUnit; |
| + |
| + @override |
| DartType get returnType => declaredReturnType ?? inferredReturnType; |
| @override |
| @@ -1872,13 +1878,13 @@ abstract class ExecutableElementForLink extends Object |
| FunctionTypeImpl get type => _type ??= new FunctionTypeImpl(this); |
| @override |
| - TypeParameterizedElementForLink get typeParameterContext => this; |
| + TypeParameterizedElementMixin get typeParameterContext => this; |
| @override |
| List<UnlinkedParam> get unlinkedParameters => _unlinkedExecutable.parameters; |
| @override |
| - List<UnlinkedTypeParam> get _unlinkedTypeParams => |
| + List<UnlinkedTypeParam> get unlinkedTypeParams => |
| _unlinkedExecutable.typeParameters; |
| @override |
| @@ -2255,7 +2261,7 @@ class ExprTypeComputer { |
| stack.add(enclosingClass.buildType((int i) { |
| // Type argument explicitly specified. |
| if (i < ref.typeArguments.length) { |
| - return unit._resolveTypeRef( |
| + return unit.resolveTypeRef( |
| ref.typeArguments[i], variable._typeParameterContext); |
| } |
| // In strong mode, type argument defaults to bound (if any). |
| @@ -2395,7 +2401,7 @@ class ExprTypeComputer { |
| DartType _getNextTypeRef() { |
| EntityRef ref = _getNextRef(); |
| - return unit._resolveTypeRef(ref, variable._typeParameterContext); |
| + return unit.resolveTypeRef(ref, variable._typeParameterContext); |
| } |
| /** |
| @@ -2582,7 +2588,7 @@ class FieldElementForLink_ClassField extends VariableElementForLink |
| } |
| @override |
| - TypeParameterizedElementForLink get _typeParameterContext => enclosingElement; |
| + TypeParameterizedElementMixin get _typeParameterContext => enclosingElement; |
| /** |
| * Store the results of type inference for this field in |
| @@ -2656,7 +2662,7 @@ class FunctionElementForLink_FunctionTypedParam extends Object |
| final ParameterElementForLink enclosingElement; |
| @override |
| - final TypeParameterizedElementForLink typeParameterContext; |
| + final TypeParameterizedElementMixin typeParameterContext; |
| @override |
| final List<UnlinkedParam> unlinkedParameters; |
| @@ -2684,7 +2690,7 @@ class FunctionElementForLink_FunctionTypedParam extends Object |
| if (enclosingElement._unlinkedParam.type == null) { |
| _returnType = DynamicTypeImpl.instance; |
| } else { |
| - _returnType = enclosingElement.compilationUnit._resolveTypeRef( |
| + _returnType = enclosingElement.compilationUnit.resolveTypeRef( |
| enclosingElement._unlinkedParam.type, typeParameterContext); |
| } |
| } |
| @@ -2778,7 +2784,7 @@ class FunctionElementForLink_Local implements FunctionElementImpl { |
| */ |
| class FunctionTypeAliasElementForLink extends Object |
| with |
| - TypeParameterizedElementForLink, |
| + TypeParameterizedElementMixin, |
| ParameterParentElementForLink, |
| ReferenceableElementForLink |
| implements FunctionTypeAliasElement, ElementImpl { |
| @@ -2804,7 +2810,7 @@ class FunctionTypeAliasElementForLink extends Object |
| CompilationUnitElementForLink get compilationUnit => enclosingElement; |
| @override |
| - TypeParameterizedElementForLink get enclosingTypeParameterContext => null; |
| + TypeParameterizedElementMixin get enclosingTypeParameterContext => null; |
| @override |
| String get identifier => _unlinkedTypedef.name; |
| @@ -2822,17 +2828,20 @@ class FunctionTypeAliasElementForLink extends Object |
| String get name => _unlinkedTypedef.name; |
| @override |
| + ResynthesizerContext get resynthesizerContext => enclosingElement; |
| + |
| + @override |
| DartType get returnType => _returnType ??= |
| - enclosingElement._resolveTypeRef(_unlinkedTypedef.returnType, this); |
| + enclosingElement.resolveTypeRef(_unlinkedTypedef.returnType, this); |
| @override |
| - TypeParameterizedElementForLink get typeParameterContext => this; |
| + TypeParameterizedElementMixin get typeParameterContext => this; |
| @override |
| List<UnlinkedParam> get unlinkedParameters => _unlinkedTypedef.parameters; |
| @override |
| - List<UnlinkedTypeParam> get _unlinkedTypeParams => |
| + List<UnlinkedTypeParam> get unlinkedTypeParams => |
| _unlinkedTypedef.typeParameters; |
| @override |
| @@ -3540,7 +3549,7 @@ class ParameterElementForLink implements ParameterElementImpl { |
| /** |
| * The innermost enclosing element that can declare type parameters. |
| */ |
| - final TypeParameterizedElementForLink _typeParameterContext; |
| + final TypeParameterizedElementMixin _typeParameterContext; |
| /** |
| * If this parameter has a default value and the enclosing library |
| @@ -3612,7 +3621,7 @@ class ParameterElementForLink implements ParameterElementImpl { |
| _declaredType = DynamicTypeImpl.instance; |
| } |
| } else { |
| - _declaredType = compilationUnit._resolveTypeRef( |
| + _declaredType = compilationUnit.resolveTypeRef( |
| _unlinkedParam.type, _typeParameterContext); |
| } |
| } |
| @@ -3689,8 +3698,13 @@ abstract class ParameterParentElementForLink implements Element { |
| _parameters = new List<ParameterElementForLink>(numParameters); |
| for (int i = 0; i < numParameters; i++) { |
| UnlinkedParam unlinkedParam = unlinkedParameters[i]; |
| - _parameters[i] = new ParameterElementForLink(this, unlinkedParam, |
| - typeParameterContext, typeParameterContext.compilationUnit, i); |
| + _parameters[i] = new ParameterElementForLink( |
| + this, |
| + unlinkedParam, |
| + typeParameterContext, |
| + typeParameterContext.resynthesizerContext |
| + as CompilationUnitElementForLink, |
| + i); |
| } |
| } |
| return _parameters; |
| @@ -3701,7 +3715,7 @@ abstract class ParameterParentElementForLink implements Element { |
| * may be [this], or may be a parent when there are function-typed |
| * parameters). |
| */ |
| - TypeParameterizedElementForLink get typeParameterContext; |
| + TypeParameterizedElementMixin get typeParameterContext; |
| /** |
| * Get the list of unlinked parameters of this element. |
| @@ -4067,6 +4081,9 @@ class TopLevelFunctionElementForLink extends ExecutableElementForLink |
| DartType get asStaticType => type; |
| @override |
| + String get identifier => _unlinkedExecutable.name; |
| + |
| + @override |
| ElementKind get kind => ElementKind.FUNCTION; |
| @override |
| @@ -4093,7 +4110,7 @@ class TopLevelVariableElementForLink extends VariableElementForLink |
| LibraryElementForLink get library => compilationUnit.library; |
| @override |
| - TypeParameterizedElementForLink get _typeParameterContext => null; |
| + TypeParameterizedElementMixin get _typeParameterContext => null; |
| /** |
| * Store the results of type inference for this variable in |
| @@ -4222,154 +4239,6 @@ class TypeInferenceNode extends Node<TypeInferenceNode> { |
| String toString() => 'TypeInferenceNode($variableElement)'; |
| } |
| -/** |
| - * Element representing a type parameter resynthesized from a summary during |
| - * linking. |
| - */ |
| -class TypeParameterElementForLink implements TypeParameterElementImpl { |
| - /** |
| - * The unlinked representation of the type parameter in the summary. |
| - */ |
| - final UnlinkedTypeParam _unlinkedTypeParam; |
| - |
| - /** |
| - * The number of type parameters whose scope overlaps this one, and which are |
| - * declared earlier in the file. |
| - */ |
| - final int nestingLevel; |
| - |
| - @override |
| - final TypeParameterizedElementForLink enclosingElement; |
| - |
| - TypeParameterTypeImpl _type; |
| - ElementLocation _location; |
| - |
| - DartType _bound; |
| - |
| - TypeParameterElementForLink( |
| - this.enclosingElement, this._unlinkedTypeParam, this.nestingLevel); |
| - |
| - @override |
| - DartType get bound { |
| - if (_unlinkedTypeParam.bound == null) { |
| - return null; |
| - } |
| - return _bound ??= enclosingElement.compilationUnit |
| - ._resolveTypeRef(_unlinkedTypeParam.bound, enclosingElement); |
| - } |
| - |
| - @override |
| - String get identifier => name; |
| - |
| - @override |
| - ElementKind get kind => ElementKind.TYPE_PARAMETER; |
| - |
| - @override |
| - ElementLocation get location => |
| - _location ??= new ElementLocationImpl.con1(this); |
| - |
| - @override |
| - String get name => _unlinkedTypeParam.name; |
| - |
| - @override |
| - TypeParameterTypeImpl get type => _type ??= new TypeParameterTypeImpl(this); |
| - |
| - @override |
| - noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| -} |
| - |
| -/** |
| - * Mixin representing an element which can have type parameters. |
| - */ |
| -abstract class TypeParameterizedElementForLink |
| - implements TypeParameterizedElement { |
| - List<TypeParameterType> _typeParameterTypes; |
| - List<TypeParameterElementForLink> _typeParameters; |
| - int _nestingLevel; |
| - |
| - /** |
| - * Get the compilation unit in which this element is declared. |
| - */ |
| - CompilationUnitElementForLink get compilationUnit; |
| - |
| - /** |
| - * Get the type parameter context enclosing this one, if any. |
| - */ |
| - TypeParameterizedElementForLink get enclosingTypeParameterContext; |
| - |
| - /** |
| - * Find out how many type parameters are in scope in this context. |
| - */ |
| - int get typeParameterNestingLevel => |
| - _nestingLevel ??= _unlinkedTypeParams.length + |
| - (enclosingTypeParameterContext?.typeParameterNestingLevel ?? 0); |
| - |
| - List<TypeParameterElementForLink> get typeParameters { |
| - if (_typeParameters == null) { |
| - int enclosingNestingLevel = |
| - enclosingTypeParameterContext?.typeParameterNestingLevel ?? 0; |
| - int numTypeParameters = _unlinkedTypeParams.length; |
| - _typeParameters = |
| - new List<TypeParameterElementForLink>(numTypeParameters); |
| - for (int i = 0; i < numTypeParameters; i++) { |
| - _typeParameters[i] = new TypeParameterElementForLink( |
| - this, _unlinkedTypeParams[i], enclosingNestingLevel + i); |
| - } |
| - } |
| - return _typeParameters; |
| - } |
| - |
| - /** |
| - * Get a list of [TypeParameterType] objects corresponding to the |
| - * element's type parameters. |
| - */ |
| - List<TypeParameterType> get typeParameterTypes { |
| - if (_typeParameterTypes == null) { |
| - _typeParameterTypes = typeParameters |
| - .map((TypeParameterElementForLink e) => e.type) |
| - .toList(); |
| - } |
| - return _typeParameterTypes; |
| - } |
| - |
| - /** |
| - * Get the [UnlinkedTypeParam]s representing the type parameters declared by |
| - * this element. |
| - */ |
| - List<UnlinkedTypeParam> get _unlinkedTypeParams; |
| - |
| - /** |
| - * Convert the given [index] into a type parameter type. |
| - */ |
| - TypeParameterType getTypeParameterType(int index) { |
| - List<TypeParameterType> types = typeParameterTypes; |
| - if (index <= types.length) { |
| - return types[types.length - index]; |
| - } else if (enclosingTypeParameterContext != null) { |
| - return enclosingTypeParameterContext |
| - .getTypeParameterType(index - types.length); |
| - } else { |
| - // If we get here, it means that a summary contained a type parameter index |
| - // that was out of range. |
| - throw new RangeError('Invalid type parameter index'); |
| - } |
| - } |
| - |
| - /** |
| - * Find out if the given [typeParameter] is in scope in this context. |
| - */ |
| - bool isTypeParameterInScope(TypeParameterElementForLink typeParameter) { |
| - if (typeParameter.enclosingElement == this) { |
| - return true; |
| - } else if (enclosingTypeParameterContext != null) { |
| - return enclosingTypeParameterContext |
| - .isTypeParameterInScope(typeParameter); |
| - } else { |
| - return false; |
| - } |
| - } |
| -} |
| - |
| class TypeProviderForLink implements TypeProvider { |
| final Linker _linker; |
| @@ -4579,7 +4448,7 @@ abstract class VariableElementForLink |
| if (unlinkedVariable.type == null) { |
| return null; |
| } else { |
| - return _declaredType ??= compilationUnit._resolveTypeRef( |
| + return _declaredType ??= compilationUnit.resolveTypeRef( |
| unlinkedVariable.type, _typeParameterContext); |
| } |
| } |
| @@ -4671,7 +4540,7 @@ abstract class VariableElementForLink |
| * The context in which type parameters should be interpreted, or `null` if |
| * there are no type parameters in scope. |
| */ |
| - TypeParameterizedElementForLink get _typeParameterContext; |
| + TypeParameterizedElementMixin get _typeParameterContext; |
| @override |
| noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |