Chromium Code Reviews| 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..bf610c70b899499ce4807872d530b78ed333a646 100644 |
| --- a/pkg/kernel/lib/transformations/closure/converter.dart |
| +++ b/pkg/kernel/lib/transformations/closure/converter.dart |
| @@ -18,18 +18,16 @@ import '../../ast.dart' |
| Expression, |
| ExpressionStatement, |
| Field, |
| - FieldInitializer, |
| ForInStatement, |
| ForStatement, |
| FunctionDeclaration, |
| FunctionExpression, |
| FunctionNode, |
| FunctionType, |
| - Initializer, |
| InterfaceType, |
| InvalidExpression, |
| InvocationExpression, |
| - Let, |
| + // Let, |
|
Dmitry Stefantsov
2017/07/13 07:19:53
If this import is not longer needed, it should be
sjindel
2017/07/13 11:34:04
Done.
|
| Library, |
| LocalInitializer, |
| Member, |
| @@ -70,13 +68,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 +193,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) { |