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; |
} |
} |