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 2897282b2b001ec88064d678d5af4b77e3fb30ca..1acac44494f2ed5453356df12c96f94bdbab2708 100644 |
--- a/pkg/analyzer/lib/src/dart/element/element.dart |
+++ b/pkg/analyzer/lib/src/dart/element/element.dart |
@@ -3117,6 +3117,10 @@ abstract class ExecutableElementImpl extends ElementImpl |
@override |
List<ParameterElement> get parameters { |
+ if (serializedExecutable != null) { |
+ _parameters ??= ParameterElementImpl.resynthesizeList( |
+ serializedExecutable.parameters, this); |
+ } |
return _parameters ?? const <ParameterElement>[]; |
} |
@@ -3125,6 +3129,7 @@ abstract class ExecutableElementImpl extends ElementImpl |
* [parameters]. |
*/ |
void set parameters(List<ParameterElement> parameters) { |
+ assert(serializedExecutable == null); |
for (ParameterElement parameter in parameters) { |
(parameter as ParameterElementImpl).enclosingElement = this; |
} |
@@ -3730,12 +3735,47 @@ class FunctionElementImpl_forLUB extends FunctionElementImpl { |
@override |
final TypeParameterizedElementMixin enclosingTypeParameterContext; |
+ final EntityRef _entityRef; |
+ |
FunctionElementImpl_forLUB( |
- this.enclosingUnit, this.enclosingTypeParameterContext) |
+ this.enclosingUnit, this.enclosingTypeParameterContext, this._entityRef) |
: super('', -1); |
@override |
bool get isSynthetic => true; |
+ |
+ @override |
+ List<ParameterElement> get parameters { |
+ return _parameters ??= ParameterElementImpl |
+ .resynthesizeList(_entityRef.syntheticParams, this, synthetic: true); |
+ } |
+ |
+ @override |
+ void set parameters(List<ParameterElement> parameters) { |
+ assert(false); |
+ } |
+ |
+ @override |
+ DartType get returnType { |
+ return _returnType ??= enclosingUnit.resynthesizerContext |
+ .resolveTypeRef(_entityRef.syntheticReturnType, typeParameterContext); |
+ } |
+ |
+ @override |
+ void set returnType(DartType returnType) { |
+ assert(false); |
+ } |
+ |
+ @override |
+ FunctionType get type { |
+ return _type ??= |
+ new FunctionTypeImpl.elementWithNameAndArgs(this, null, null, false); |
+ } |
+ |
+ @override |
+ void set type(FunctionType type) { |
+ assert(false); |
+ } |
} |
/** |
@@ -3752,7 +3792,7 @@ class FunctionTypeAliasElementImpl extends ElementImpl |
/** |
* A list containing all of the parameters defined by this type alias. |
*/ |
- List<ParameterElement> _parameters = ParameterElement.EMPTY_LIST; |
+ List<ParameterElement> _parameters; |
/** |
* The return type defined by this type alias. |
@@ -3873,12 +3913,19 @@ class FunctionTypeAliasElementImpl extends ElementImpl |
} |
@override |
- List<ParameterElement> get parameters => _parameters; |
+ List<ParameterElement> get parameters { |
+ if (_unlinkedTypedef != null) { |
+ _parameters ??= ParameterElementImpl.resynthesizeList( |
+ _unlinkedTypedef.parameters, this); |
+ } |
+ return _parameters ?? const <ParameterElement>[]; |
+ } |
/** |
* Set the parameters defined by this type alias to the given [parameters]. |
*/ |
void set parameters(List<ParameterElement> parameters) { |
+ assert(_unlinkedTypedef == null); |
if (parameters != null) { |
for (ParameterElement parameter in parameters) { |
(parameter as ParameterElementImpl).enclosingElement = this; |
@@ -3983,7 +4030,7 @@ class FunctionTypeAliasElementImpl extends ElementImpl |
@override |
ElementImpl getChild(String identifier) { |
- for (ParameterElement parameter in _parameters) { |
+ for (ParameterElement parameter in parameters) { |
ParameterElementImpl parameterImpl = parameter; |
if (parameterImpl.identifier == identifier) { |
return parameterImpl; |
@@ -4001,7 +4048,7 @@ class FunctionTypeAliasElementImpl extends ElementImpl |
@override |
void visitChildren(ElementVisitor visitor) { |
super.visitChildren(visitor); |
- safelyVisitChildren(_parameters, visitor); |
+ safelyVisitChildren(parameters, visitor); |
safelyVisitChildren(_typeParameters, visitor); |
} |
} |
@@ -6354,11 +6401,9 @@ class ParameterElementImpl extends VariableElementImpl |
if (!isSynthetic) { |
parameterTypeElement.enclosingElement = this; |
} |
- List<ParameterElement> subParameters = _unlinkedParam.parameters |
- .map((UnlinkedParam p) => |
- new ParameterElementImpl.forSerializedFactory(p, this, |
- synthetic: isSynthetic)) |
- .toList(growable: false); |
+ List<ParameterElement> subParameters = ParameterElementImpl |
+ .resynthesizeList(_unlinkedParam.parameters, this, |
+ synthetic: isSynthetic); |
if (isSynthetic) { |
parameterTypeElement.parameters = subParameters; |
} else { |
@@ -6380,6 +6425,26 @@ class ParameterElementImpl extends VariableElementImpl |
} |
} |
} |
+ |
+ /** |
+ * Create and return [ParameterElement]s for the given [unlinkedParameters]. |
+ */ |
+ static List<ParameterElement> resynthesizeList( |
+ List<UnlinkedParam> unlinkedParameters, ElementImpl enclosingElement, |
+ {bool synthetic: false}) { |
+ int length = unlinkedParameters.length; |
+ if (length != 0) { |
+ List<ParameterElement> parameters = new List<ParameterElement>(length); |
+ for (int i = 0; i < length; i++) { |
+ parameters[i] = new ParameterElementImpl.forSerializedFactory( |
+ unlinkedParameters[i], enclosingElement, |
+ synthetic: synthetic); |
+ } |
+ return parameters; |
+ } else { |
+ return const <ParameterElement>[]; |
+ } |
+ } |
} |
/** |