| 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 cf4d49346a521c67f48c3003cc3d1039a87b7412..4ed332041ff40e884d8e446b0f9a23fd0b4c5bf6 100644
|
| --- a/pkg/analyzer/lib/src/dart/element/element.dart
|
| +++ b/pkg/analyzer/lib/src/dart/element/element.dart
|
| @@ -811,6 +811,9 @@ class ClassElementImpl extends AbstractClassElementImpl
|
| }
|
|
|
| @override
|
| + List<kernel.TypeParameter> get kernelTypeParams => _kernel?.typeParameters;
|
| +
|
| + @override
|
| List<ElementAnnotation> get metadata {
|
| if (_unlinkedClass != null) {
|
| return _metadata ??=
|
| @@ -888,19 +891,30 @@ class ClassElementImpl extends AbstractClassElementImpl
|
|
|
| @override
|
| InterfaceType get supertype {
|
| - if (_unlinkedClass != null && _supertype == null) {
|
| - if (_unlinkedClass.supertype != null) {
|
| - DartType type = enclosingUnit.resynthesizerContext
|
| - .resolveTypeRef(this, _unlinkedClass.supertype);
|
| - if (_isClassInterfaceType(type)) {
|
| - _supertype = type;
|
| + if (_supertype == null) {
|
| + if (_kernel != null) {
|
| + if (_kernel.supertype != null) {
|
| + _supertype = enclosingUnit._kernelContext
|
| + .getInterfaceType(this, _kernel.supertype);
|
| + _supertype ??= context.typeProvider.objectType;
|
| + } else {
|
| + return null;
|
| + }
|
| + }
|
| + if (_unlinkedClass != null) {
|
| + if (_unlinkedClass.supertype != null) {
|
| + DartType type = enclosingUnit.resynthesizerContext
|
| + .resolveTypeRef(this, _unlinkedClass.supertype);
|
| + if (_isClassInterfaceType(type)) {
|
| + _supertype = type;
|
| + } else {
|
| + _supertype = context.typeProvider.objectType;
|
| + }
|
| + } else if (_unlinkedClass.hasNoSupertype) {
|
| + return null;
|
| } else {
|
| _supertype = context.typeProvider.objectType;
|
| }
|
| - } else if (_unlinkedClass.hasNoSupertype) {
|
| - return null;
|
| - } else {
|
| - _supertype = context.typeProvider.objectType;
|
| }
|
| }
|
| return _supertype;
|
| @@ -3831,6 +3845,9 @@ abstract class ExecutableElementImpl extends ElementImpl
|
| bool get isSynchronous => !isAsynchronous;
|
|
|
| @override
|
| + List<kernel.TypeParameter> get kernelTypeParams => null;
|
| +
|
| + @override
|
| List<ElementAnnotation> get metadata {
|
| if (serializedExecutable != null) {
|
| return _metadata ??=
|
| @@ -4665,6 +4682,9 @@ class FunctionTypeAliasElementImpl extends ElementImpl
|
| _enclosingElement as CompilationUnitElementImpl;
|
|
|
| @override
|
| + List<kernel.TypeParameter> get kernelTypeParams => null;
|
| +
|
| + @override
|
| ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
|
|
|
| @override
|
| @@ -4879,6 +4899,9 @@ class GenericFunctionTypeElementImpl extends ElementImpl
|
| String get identifier => '-';
|
|
|
| @override
|
| + List<kernel.TypeParameter> get kernelTypeParams => null;
|
| +
|
| + @override
|
| ElementKind get kind => ElementKind.GENERIC_FUNCTION_TYPE;
|
|
|
| @override
|
| @@ -5106,6 +5129,9 @@ class GenericTypeAliasElementImpl extends ElementImpl
|
| }
|
|
|
| @override
|
| + List<kernel.TypeParameter> get kernelTypeParams => null;
|
| +
|
| + @override
|
| ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
|
|
|
| @override
|
| @@ -5563,6 +5589,18 @@ class ImportElementImpl extends UriReferencedElementImpl
|
| */
|
| abstract class KernelLibraryResynthesizerContext {
|
| kernel.Library get library;
|
| +
|
| + /**
|
| + * Return the [InterfaceType] for the given Kernel [type], or `null` if the
|
| + * [type] does not correspond to an [InterfaceType].
|
| + */
|
| + InterfaceType getInterfaceType(ElementImpl context, kernel.Supertype type);
|
| +
|
| + /**
|
| + * Return the [DartType] for the given Kernel [type], or `null` if the [type]
|
| + * does not correspond to a [DartType].
|
| + */
|
| + DartType getType(ElementImpl context, kernel.DartType type);
|
| }
|
|
|
| /**
|
| @@ -8451,6 +8489,11 @@ class TypeParameterElementImpl extends ElementImpl
|
| final int nestingLevel;
|
|
|
| /**
|
| + * The kernel of the element.
|
| + */
|
| + final kernel.TypeParameter _kernel;
|
| +
|
| + /**
|
| * The type defined by this type parameter.
|
| */
|
| TypeParameterType _type;
|
| @@ -8468,14 +8511,25 @@ class TypeParameterElementImpl extends ElementImpl
|
| TypeParameterElementImpl(String name, int offset)
|
| : _unlinkedTypeParam = null,
|
| nestingLevel = null,
|
| + _kernel = null,
|
| super(name, offset);
|
|
|
| /**
|
| + * Initialize using the given kernel.
|
| + */
|
| + TypeParameterElementImpl.forKernel(
|
| + TypeParameterizedElementMixin enclosingElement, this._kernel)
|
| + : _unlinkedTypeParam = null,
|
| + nestingLevel = null,
|
| + super.forSerialized(enclosingElement);
|
| +
|
| + /**
|
| * Initialize a newly created type parameter element to have the given [name].
|
| */
|
| TypeParameterElementImpl.forNode(Identifier name)
|
| : _unlinkedTypeParam = null,
|
| nestingLevel = null,
|
| + _kernel = null,
|
| super.forNode(name);
|
|
|
| /**
|
| @@ -8483,7 +8537,8 @@ class TypeParameterElementImpl extends ElementImpl
|
| */
|
| TypeParameterElementImpl.forSerialized(this._unlinkedTypeParam,
|
| TypeParameterizedElementMixin enclosingElement, this.nestingLevel)
|
| - : super.forSerialized(enclosingElement);
|
| + : _kernel = null,
|
| + super.forSerialized(enclosingElement);
|
|
|
| /**
|
| * Initialize a newly created synthetic type parameter element to have the
|
| @@ -8492,18 +8547,26 @@ class TypeParameterElementImpl extends ElementImpl
|
| TypeParameterElementImpl.synthetic(String name)
|
| : _unlinkedTypeParam = null,
|
| nestingLevel = null,
|
| + _kernel = null,
|
| super(name, -1) {
|
| isSynthetic = true;
|
| }
|
|
|
| DartType get bound {
|
| - if (_unlinkedTypeParam != null) {
|
| - if (_unlinkedTypeParam.bound == null) {
|
| - return null;
|
| + if (_bound == null) {
|
| + if (_kernel != null) {
|
| + _bound = enclosingUnit._kernelContext.getType(this, _kernel.bound);
|
| + // TODO(scheglov) Add a flag for explicit bound.
|
| + if (_bound != null && _bound.isObject) _bound = null;
|
| + }
|
| + if (_unlinkedTypeParam != null) {
|
| + if (_unlinkedTypeParam.bound == null) {
|
| + return null;
|
| + }
|
| + _bound = enclosingUnit.resynthesizerContext.resolveTypeRef(
|
| + this, _unlinkedTypeParam.bound,
|
| + instantiateToBoundsAllowed: false, declaredType: true);
|
| }
|
| - return _bound ??= enclosingUnit.resynthesizerContext.resolveTypeRef(
|
| - this, _unlinkedTypeParam.bound,
|
| - instantiateToBoundsAllowed: false, declaredType: true);
|
| }
|
| return _bound;
|
| }
|
| @@ -8546,6 +8609,9 @@ class TypeParameterElementImpl extends ElementImpl
|
|
|
| @override
|
| String get name {
|
| + if (_kernel != null) {
|
| + return _kernel.name;
|
| + }
|
| if (_unlinkedTypeParam != null) {
|
| return _unlinkedTypeParam.name;
|
| }
|
| @@ -8651,6 +8717,12 @@ abstract class TypeParameterizedElementMixin
|
| */
|
| CompilationUnitElementImpl get enclosingUnit;
|
|
|
| + /**
|
| + * Get the [kernel.TypeParameter]s declared by this element, or `null` if
|
| + * this elements isn't from a kernel.
|
| + */
|
| + List<kernel.TypeParameter> get kernelTypeParams;
|
| +
|
| @override
|
| TypeParameterizedElementMixin get typeParameterContext => this;
|
|
|
| @@ -8664,6 +8736,17 @@ abstract class TypeParameterizedElementMixin
|
| @override
|
| List<TypeParameterElement> get typeParameters {
|
| if (_typeParameterElements == null) {
|
| + List<kernel.TypeParameter> kernelParams = kernelTypeParams;
|
| + if (kernelParams != null) {
|
| + int numTypeParameters = kernelParams.length;
|
| + _typeParameterElements =
|
| + new List<TypeParameterElement>(numTypeParameters);
|
| + for (int i = 0; i < numTypeParameters; i++) {
|
| + _typeParameterElements[i] =
|
| + new TypeParameterElementImpl.forKernel(this, kernelParams[i]);
|
| + }
|
| + }
|
| +
|
| List<UnlinkedTypeParam> unlinkedParams = unlinkedTypeParams;
|
| if (unlinkedParams != null) {
|
| int enclosingNestingLevel =
|
|
|