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 78d0f5f496275bf18d56e98cef9fd068b33ae782..93652e9e52a649de106c10baf12e4b730f074113 100644 |
--- a/pkg/analyzer/lib/src/dart/element/element.dart |
+++ b/pkg/analyzer/lib/src/dart/element/element.dart |
@@ -1798,6 +1798,32 @@ class DefaultFieldFormalParameterElementImpl |
*/ |
DefaultFieldFormalParameterElementImpl.forNode(Identifier name) |
: super.forNode(name); |
+ |
+ /** |
+ * Initialize using the given serialized information. |
+ */ |
+ DefaultFieldFormalParameterElementImpl.forSerialized( |
+ UnlinkedParam unlinkedParam, ElementImpl enclosingElement) |
+ : super.forSerialized(unlinkedParam, enclosingElement); |
+ |
+ @override |
+ Expression get constantInitializer { |
+ if (_unlinkedParam != null) { |
+ UnlinkedConst defaultValue = _unlinkedParam.defaultValue; |
+ if (defaultValue == null) { |
+ return null; |
+ } |
+ return super.constantInitializer ??= enclosingUnit.resynthesizerContext |
+ .buildExpression(this, defaultValue); |
+ } |
+ return super.constantInitializer; |
+ } |
+ |
+ @override |
+ void set constantInitializer(Expression initializer) { |
+ assert(_unlinkedParam == null); |
+ super.constantInitializer = initializer; |
+ } |
} |
/** |
@@ -3338,7 +3364,7 @@ class FieldFormalParameterElementImpl extends ParameterElementImpl |
/** |
* The field associated with this field formal parameter. |
*/ |
- FieldElement field; |
+ FieldElement _field; |
/** |
* Initialize a newly created parameter element to have the given [name] and |
@@ -3353,10 +3379,47 @@ class FieldFormalParameterElementImpl extends ParameterElementImpl |
FieldFormalParameterElementImpl.forNode(Identifier name) |
: super.forNode(name); |
+ /** |
+ * Initialize using the given serialized information. |
+ */ |
+ FieldFormalParameterElementImpl.forSerialized( |
+ UnlinkedParam unlinkedParam, ElementImpl enclosingElement) |
+ : super.forSerialized(unlinkedParam, enclosingElement); |
+ |
+ @override |
+ FieldElement get field { |
+ if (_unlinkedParam != null && _field == null) { |
+ Element enclosingClass = enclosingElement?.enclosingElement; |
+ if (enclosingClass is ClassElement) { |
+ _field = enclosingClass.getField(_unlinkedParam.name); |
+ } |
+ } |
+ return _field; |
+ } |
+ |
+ void set field(FieldElement field) { |
+ assert(_unlinkedParam == null); |
+ _field = field; |
+ } |
+ |
@override |
bool get isInitializingFormal => true; |
@override |
+ DartType get type { |
+ if (_unlinkedParam != null && _unlinkedParam.type == null) { |
+ _type ??= field?.type ?? DynamicTypeImpl.instance; |
+ } |
+ return super.type; |
+ } |
+ |
+ @override |
+ void set type(DartType type) { |
+ assert(_unlinkedParam == null); |
+ _type = type; |
+ } |
+ |
+ @override |
accept(ElementVisitor visitor) => |
visitor.visitFieldFormalParameterElement(this); |
} |
@@ -3506,6 +3569,50 @@ class FunctionElementImpl extends ExecutableElementImpl |
} |
/** |
+ * Implementation of [FunctionElementImpl] for a function typed parameter. |
+ */ |
+class FunctionElementImpl_forFunctionTypedParameter |
+ extends FunctionElementImpl { |
+ @override |
+ final CompilationUnitElementImpl enclosingUnit; |
+ |
+ /** |
+ * The enclosing function typed [ParameterElementImpl]. |
+ */ |
+ final ParameterElementImpl _parameter; |
+ |
+ FunctionElementImpl_forFunctionTypedParameter( |
+ this.enclosingUnit, this._parameter) |
+ : super('', -1); |
+ |
+ @override |
+ TypeParameterizedElementMixin get enclosingTypeParameterContext => |
+ _parameter.typeParameterContext; |
+ |
+ @override |
+ bool get isSynthetic => true; |
+} |
+ |
+/** |
+ * Implementation of [FunctionElementImpl] for a synthetic function element |
+ * that was synthesized by a LUB computation. |
+ */ |
+class FunctionElementImpl_forLUB extends FunctionElementImpl { |
+ @override |
+ final CompilationUnitElementImpl enclosingUnit; |
+ |
+ @override |
+ final TypeParameterizedElementMixin enclosingTypeParameterContext; |
+ |
+ FunctionElementImpl_forLUB( |
+ this.enclosingUnit, this.enclosingTypeParameterContext) |
+ : super('', -1); |
+ |
+ @override |
+ bool get isSynthetic => true; |
+} |
+ |
+/** |
* A concrete implementation of a [FunctionTypeAliasElement]. |
*/ |
class FunctionTypeAliasElementImpl extends ElementImpl |
@@ -5855,6 +5962,17 @@ class ParameterElementImpl extends VariableElementImpl |
} |
@override |
+ DartType get type { |
+ if (_unlinkedParam != null && _type == null) { |
+ _type = enclosingUnit.resynthesizerContext.resolveLinkedType( |
+ _unlinkedParam.inferredTypeSlot, typeParameterContext) ?? |
+ enclosingUnit.resynthesizerContext |
+ .resolveTypeRef(_unlinkedParam.type, typeParameterContext); |
+ } |
+ return super.type; |
+ } |
+ |
+ @override |
List<TypeParameterElement> get typeParameters => _typeParameters; |
/** |
@@ -6294,6 +6412,13 @@ abstract class ResynthesizerContext { |
UnitExplicitTopLevelVariables buildTopLevelVariables(); |
/** |
+ * Build the appropriate [DartType] object corresponding to a slot id in the |
+ * [LinkedUnit.types] table. |
+ */ |
+ DartType resolveLinkedType( |
+ int slot, TypeParameterizedElementMixin typeParameterContext); |
+ |
+ /** |
* Resolve an [EntityRef] into a type. If the reference is |
* unresolved, return [DynamicTypeImpl.instance]. |
* |
@@ -6777,7 +6902,7 @@ abstract class VariableElementImpl extends ElementImpl |
/** |
* The declared type of this variable. |
*/ |
- DartType type; |
+ DartType _type; |
/** |
* A synthetic function representing this variable's initializer, or `null` if |
@@ -6896,6 +7021,13 @@ abstract class VariableElementImpl extends ElementImpl |
bool get isStatic => hasModifier(Modifier.STATIC); |
@override |
+ DartType get type => _type; |
+ |
+ void set type(DartType type) { |
+ _type = type; |
+ } |
+ |
+ @override |
void appendTo(StringBuffer buffer) { |
buffer.write(type); |
buffer.write(" "); |