Skip to content

Commit 0a5ecc5

Browse files
committed
Resynthesize return types lazily.
[email protected] BUG= Review URL: https://codereview.chromium.org/2007323006 .
1 parent cdc0b17 commit 0a5ecc5

File tree

2 files changed

+39
-16
lines changed

2 files changed

+39
-16
lines changed

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,6 +1681,9 @@ class ConstructorElementImpl extends ExecutableElementImpl
16811681
@override
16821682
ElementKind get kind => ElementKind.CONSTRUCTOR;
16831683

1684+
@override
1685+
DartType get returnType => enclosingElement.type;
1686+
16841687
@override
16851688
accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
16861689

@@ -2806,7 +2809,7 @@ abstract class ExecutableElementImpl extends ElementImpl
28062809
/**
28072810
* The return type defined by this executable element.
28082811
*/
2809-
DartType returnType;
2812+
DartType _returnType;
28102813

28112814
/**
28122815
* The type of function defined by this executable element.
@@ -3039,6 +3042,26 @@ abstract class ExecutableElementImpl extends ElementImpl
30393042
this._parameters = parameters;
30403043
}
30413044

3045+
@override
3046+
DartType get returnType {
3047+
if (serializedExecutable != null && _returnType == null) {
3048+
bool isSetter =
3049+
serializedExecutable.kind == UnlinkedExecutableKind.setter;
3050+
_returnType = enclosingUnit.resynthesizerContext.resolveLinkedType(
3051+
serializedExecutable.inferredReturnTypeSlot,
3052+
typeParameterContext) ??
3053+
enclosingUnit.resynthesizerContext.resolveTypeRef(
3054+
serializedExecutable.returnType, typeParameterContext,
3055+
defaultVoid: isSetter && context.analysisOptions.strongMode);
3056+
}
3057+
return _returnType;
3058+
}
3059+
3060+
void set returnType(DartType returnType) {
3061+
assert(serializedExecutable == null);
3062+
_returnType = returnType;
3063+
}
3064+
30423065
@override
30433066
TypeParameterizedElementMixin get typeParameterContext => this;
30443067

@@ -3631,7 +3654,7 @@ class FunctionTypeAliasElementImpl extends ElementImpl
36313654
/**
36323655
* The return type defined by this type alias.
36333656
*/
3634-
DartType returnType;
3657+
DartType _returnType;
36353658

36363659
/**
36373660
* The type of function defined by this type alias.
@@ -3761,6 +3784,20 @@ class FunctionTypeAliasElementImpl extends ElementImpl
37613784
this._parameters = parameters;
37623785
}
37633786

3787+
@override
3788+
DartType get returnType {
3789+
if (_unlinkedTypedef != null && _returnType == null) {
3790+
_returnType = enclosingUnit.resynthesizerContext
3791+
.resolveTypeRef(_unlinkedTypedef.returnType, this);
3792+
}
3793+
return _returnType;
3794+
}
3795+
3796+
void set returnType(DartType returnType) {
3797+
assert(_unlinkedTypedef == null);
3798+
_returnType = returnType;
3799+
}
3800+
37643801
@override
37653802
TypeParameterizedElementMixin get typeParameterContext => this;
37663803

pkg/analyzer/lib/src/summary/resynthesize.dart

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,7 +1879,6 @@ class _UnitResynthesizer {
18791879
currentConstructor.periodOffset = serializedExecutable.periodOffset;
18801880
}
18811881
constructors[serializedExecutable.name] = currentConstructor;
1882-
currentConstructor.returnType = classElement.type;
18831882
buildExecutableCommonParts(currentConstructor, serializedExecutable);
18841883
currentConstructor.constantInitializers = serializedExecutable
18851884
.constantInitializers
@@ -2107,17 +2106,6 @@ class _UnitResynthesizer {
21072106
executableElement.parameters = parameters;
21082107
}
21092108
}
2110-
if (serializedExecutable.kind == UnlinkedExecutableKind.constructor) {
2111-
// Caller handles setting the return type.
2112-
assert(serializedExecutable.returnType == null);
2113-
} else {
2114-
bool isSetter =
2115-
serializedExecutable.kind == UnlinkedExecutableKind.setter;
2116-
executableElement.returnType = buildLinkedType(
2117-
serializedExecutable.inferredReturnTypeSlot, executableElement) ??
2118-
buildType(serializedExecutable.returnType, executableElement,
2119-
defaultVoid: isSetter && summaryResynthesizer.strongMode);
2120-
}
21212109
executableElement.type = new FunctionTypeImpl.elementWithNameAndArgs(
21222110
executableElement, null, getCurrentTypeArguments(skipLevels: 1), false);
21232111
{
@@ -2456,8 +2444,6 @@ class _UnitResynthesizer {
24562444
functionTypeAliasElement.parameters = serializedTypedef.parameters
24572445
.map((p) => buildParameter(p, functionTypeAliasElement))
24582446
.toList();
2459-
functionTypeAliasElement.returnType =
2460-
buildType(serializedTypedef.returnType, functionTypeAliasElement);
24612447
functionTypeAliasElement.type =
24622448
new FunctionTypeImpl.forTypedef(functionTypeAliasElement);
24632449
unitHolder.addTypeAlias(functionTypeAliasElement);

0 commit comments

Comments
 (0)