Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(423)

Unified Diff: pkg/analyzer/lib/src/dart/element/element.dart

Issue 2024453002: Resynthesize parameters lazily. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/summary/resynthesize.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..66710f4175afcde63465428f156d6c00ed99b5e1 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -3117,6 +3117,21 @@ abstract class ExecutableElementImpl extends ElementImpl
@override
List<ParameterElement> get parameters {
+ if (serializedExecutable != null && _parameters == null) {
+ List<UnlinkedParam> unlinkedParameters = serializedExecutable.parameters;
+ int length = unlinkedParameters.length;
+ if (length != 0) {
+ List<ParameterElementImpl> parameters =
+ new List<ParameterElementImpl>(length);
+ for (int i = 0; i < length; i++) {
+ parameters[i] = new ParameterElementImpl.forSerializedFactory(
+ unlinkedParameters[i], this);
+ }
+ _parameters = parameters;
+ } else {
+ _parameters = const <ParameterElement>[];
+ }
+ }
return _parameters ?? const <ParameterElement>[];
}
@@ -3125,6 +3140,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 +3746,50 @@ 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 ??= _entityRef.syntheticParams
+ .map((UnlinkedParam param) =>
+ new ParameterElementImpl.forSerializedFactory(param, this,
+ synthetic: true))
+ .toList(growable: false);
+ }
+
+ @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 +3806,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 +3927,30 @@ class FunctionTypeAliasElementImpl extends ElementImpl
}
@override
- List<ParameterElement> get parameters => _parameters;
+ List<ParameterElement> get parameters {
+ if (_unlinkedTypedef != null && _parameters == null) {
+ List<UnlinkedParam> unlinkedParameters = _unlinkedTypedef.parameters;
+ int length = unlinkedParameters.length;
+ if (length != 0) {
+ List<ParameterElementImpl> parameters =
+ new List<ParameterElementImpl>(length);
+ for (int i = 0; i < length; i++) {
+ parameters[i] = new ParameterElementImpl.forSerializedFactory(
+ unlinkedParameters[i], this);
+ }
+ _parameters = parameters;
+ } else {
+ _parameters = const <ParameterElement>[];
+ }
+ }
+ return _parameters ?? const <ParameterElement>[];
Brian Wilkerson 2016/05/27 22:38:15 Seems like I've seen a lot of code with this same
scheglov 2016/05/28 02:00:35 Good point. Done.
+ }
/**
* 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 +4055,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 +4073,7 @@ class FunctionTypeAliasElementImpl extends ElementImpl
@override
void visitChildren(ElementVisitor visitor) {
super.visitChildren(visitor);
- safelyVisitChildren(_parameters, visitor);
+ safelyVisitChildren(parameters, visitor);
safelyVisitChildren(_typeParameters, visitor);
}
}
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/summary/resynthesize.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698