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