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

Unified Diff: pkg/kernel/lib/transformations/closure/converter.dart

Issue 2981603002: Convert closures in all initializers, and share the context between them. (Closed)
Patch Set: Review comments. Created 3 years, 5 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
Index: pkg/kernel/lib/transformations/closure/converter.dart
diff --git a/pkg/kernel/lib/transformations/closure/converter.dart b/pkg/kernel/lib/transformations/closure/converter.dart
index aef306c7106ec0d9513263b3144a1883801b9684..abb0a11f9cded3e92d5be2aab4e769e08cebd7f0 100644
--- a/pkg/kernel/lib/transformations/closure/converter.dart
+++ b/pkg/kernel/lib/transformations/closure/converter.dart
@@ -18,18 +18,15 @@ import '../../ast.dart'
Expression,
ExpressionStatement,
Field,
- FieldInitializer,
ForInStatement,
ForStatement,
FunctionDeclaration,
FunctionExpression,
FunctionNode,
FunctionType,
- Initializer,
InterfaceType,
InvalidExpression,
InvocationExpression,
- Let,
Library,
LocalInitializer,
Member,
@@ -70,13 +67,7 @@ import 'context.dart' show Context, NoContext;
import 'info.dart' show ClosureInfo;
-import 'rewriter.dart'
- show
- AstRewriter,
- BlockRewriter,
- InitializerRewriter,
- FieldInitializerRewriter,
- LocalInitializerRewriter;
+import 'rewriter.dart' show AstRewriter, BlockRewriter, InitializerListRewriter;
class ClosureConverter extends Transformer {
final CoreTypes coreTypes;
@@ -201,72 +192,29 @@ class ClosureConverter extends Transformer {
context.extend(parameter, new VariableGet(parameter));
}
- static InitializerRewriter getRewriterForInitializer(
- Initializer initializer) {
- if (initializer is FieldInitializer) {
- return new FieldInitializerRewriter(initializer.value);
- }
- if (initializer is LocalInitializer) {
- return new LocalInitializerRewriter(initializer.variable.initializer);
- }
- throw "Trying to extract an initializer expression from "
- "${initializer.runtimeType}, but only FieldInitializer and "
- "LocalInitializer are supported.";
- }
-
- static Expression getInitializerExpression(Initializer initializer) {
- if (initializer is FieldInitializer) {
- return initializer.value;
- }
- if (initializer is LocalInitializer) {
- return initializer.variable.initializer;
- }
- throw "Trying to get initializing expressino from "
- "${initializer.runtimeType}, but only Field Initializer and "
- "LocalInitializer are supported.";
- }
-
TreeNode visitConstructor(Constructor node) {
assert(isEmptyContext);
currentMember = node;
+
// Transform initializers.
- for (Initializer initializer in node.initializers) {
- if (initializer is FieldInitializer || initializer is LocalInitializer) {
- // Create a rewriter and a context for the initializer expression.
- InitializerRewriter initializerRewriter =
- getRewriterForInitializer(initializer);
- rewriter = initializerRewriter;
- context = new NoContext(this);
- // Save the expression to visit it in the extended context, since the
- // rewriter will modify `initializer.value` (for [FieldInitializer]) or
- // `initializer.variable.initializer` (for [LocalInitializer]).
- Expression initializerExpression =
- getInitializerExpression(initializer);
- // Extend the context with all captured parameters of the constructor.
- // TODO(karlklose): add a fine-grained analysis of captured parameters.
- node.function.positionalParameters
- .where(capturedVariables.contains)
- .forEach(extendContextWith);
- node.function.namedParameters
- .where(capturedVariables.contains)
- .forEach(extendContextWith);
- // Transform the initializer expression.
- var parent = initializerExpression.parent;
- initializerExpression = initializerExpression.accept(this);
- initializerExpression.parent = parent;
- if (parent is Let) {
- parent.body = initializerExpression;
- } else if (parent is FieldInitializer) {
- parent.value = initializerExpression;
- } else if (parent is LocalInitializer) {
- parent.variable.initializer = initializerExpression;
- } else {
- throw "Found unexpected node '${node.runtimeType}, expected a 'Let' "
- ",a 'FieldInitializer', or a 'LocalInitializer'.";
- }
- }
+ if (node.initializers.length > 0) {
+ var initRewriter = new InitializerListRewriter(node);
+ rewriter = initRewriter;
+ context = new NoContext(this);
+
+ // TODO(karlklose): add a fine-grained analysis of captured parameters.
+ node.function.positionalParameters
+ .where(capturedVariables.contains)
+ .forEach(extendContextWith);
+ node.function.namedParameters
+ .where(capturedVariables.contains)
+ .forEach(extendContextWith);
+
+ transformList(node.initializers, this, node);
+ node.initializers.insertAll(0, initRewriter.prefix);
+ context = rewriter = null;
}
- rewriter = null;
+
// Transform constructor body.
FunctionNode function = node.function;
if (function.body != null && function.body is! EmptyStatement) {
@@ -541,8 +489,8 @@ class ClosureConverter extends Transformer {
return node;
} else {
assert(node.parent is Block);
- // When returning null, the parent block will remove this node from its
- // list of statements.
+ // When returning null, the parent block will remove
+ // this node from its list of statements.
return null;
}
}

Powered by Google App Engine
This is Rietveld 408576698