Index: pkg/analyzer/lib/src/summary/summarize_ast.dart |
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart |
index fe6e10350028a13a7e193a30127757036d7800fd..01403e19675866e83387d75b03425045a61473a9 100644 |
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart |
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart |
@@ -346,6 +346,13 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
Map<int, int> _localClosureIndexMap; |
/** |
+ * Indicates whether closure function bodies should be serialized. This flag |
+ * is set while visiting the bodies of initializer expressions that will be |
+ * needed by type inference. |
+ */ |
+ bool _serializeClosureBodyExprs = false; |
+ |
+ /** |
* Create a slot id for storing a propagated or inferred type or const cycle |
* info. |
*/ |
@@ -580,6 +587,9 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
/** |
* Serialize a [FunctionDeclaration] or [MethodDeclaration] into an |
* [UnlinkedExecutable]. |
+ * |
+ * If [serializeBodyExpr] is `true`, then the function definition is stored |
+ * in [UnlinkedExecutableBuilder.bodyExpr]. |
*/ |
UnlinkedExecutableBuilder serializeExecutable( |
AstNode node, |
@@ -595,7 +605,8 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
Comment documentationComment, |
NodeList<Annotation> annotations, |
TypeParameterList typeParameters, |
- bool isExternal) { |
+ bool isExternal, |
+ bool serializeBodyExpr) { |
int oldScopesLength = scopes.length; |
_TypeParameterScope typeParameterScope = new _TypeParameterScope(); |
scopes.add(typeParameterScope); |
@@ -643,7 +654,7 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
} |
b.visibleOffset = enclosingBlock?.offset; |
b.visibleLength = enclosingBlock?.length; |
- serializeFunctionBody(b, null, body, false); |
+ serializeFunctionBody(b, null, body, serializeBodyExpr); |
scopes.removeLast(); |
assert(scopes.length == oldScopesLength); |
return b; |
@@ -658,7 +669,8 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
* are serialized first. |
* |
* If [serializeBodyExpr] is `true`, then the function definition is stored |
- * in [UnlinkedExecutableBuilder.bodyExpr]. |
+ * in [UnlinkedExecutableBuilder.bodyExpr], and closures occurring inside |
+ * [initializers] and [body] have their function bodies serialized as well. |
* |
* The return value is a map whose keys are the offsets of local function |
* nodes representing closures inside [initializers] and [body], and whose |
@@ -679,10 +691,12 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
List<UnlinkedLabelBuilder> oldLabels = labels; |
List<UnlinkedVariableBuilder> oldVariables = variables; |
Map<int, int> oldLocalClosureIndexMap = _localClosureIndexMap; |
+ bool oldSerializeClosureBodyExprs = _serializeClosureBodyExprs; |
executables = <UnlinkedExecutableBuilder>[]; |
labels = <UnlinkedLabelBuilder>[]; |
variables = <UnlinkedVariableBuilder>[]; |
_localClosureIndexMap = <int, int>{}; |
+ _serializeClosureBodyExprs = serializeBodyExpr; |
if (initializers != null) { |
for (ConstructorInitializer initializer in initializers) { |
initializer.accept(this); |
@@ -692,6 +706,8 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
if (serializeBodyExpr) { |
if (body is Expression) { |
b.bodyExpr = serializeConstExpr(_localClosureIndexMap, body); |
+ } else if (body is ExpressionFunctionBody) { |
+ b.bodyExpr = serializeConstExpr(_localClosureIndexMap, body.expression); |
} else { |
// TODO(paulberry): serialize other types of function bodies. |
} |
@@ -704,6 +720,7 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
labels = oldLabels; |
variables = oldVariables; |
_localClosureIndexMap = oldLocalClosureIndexMap; |
+ _serializeClosureBodyExprs = oldSerializeClosureBodyExprs; |
return localClosureIndexMap; |
} |
@@ -1158,7 +1175,8 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
node.documentationComment, |
node.metadata, |
node.functionExpression.typeParameters, |
- node.externalKeyword != null)); |
+ node.externalKeyword != null, |
+ false)); |
} |
@override |
@@ -1181,7 +1199,8 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
null, |
null, |
node.typeParameters, |
- false)); |
+ false, |
+ _serializeClosureBodyExprs)); |
} |
} |
@@ -1280,7 +1299,8 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor { |
node.documentationComment, |
node.metadata, |
node.typeParameters, |
- node.externalKeyword != null)); |
+ node.externalKeyword != null, |
+ false)); |
} |
@override |