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

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

Issue 2944433002: Add tests for handling closures in LocalInitializers (Closed)
Patch Set: Merge in latest changes in master (e340ee517a) 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 e1865f7fd6d90a6c04a8e0dbeba37456490f612f..aef306c7106ec0d9513263b3144a1883801b9684 100644
--- a/pkg/kernel/lib/transformations/closure/converter.dart
+++ b/pkg/kernel/lib/transformations/closure/converter.dart
@@ -70,7 +70,13 @@ import 'context.dart' show Context, NoContext;
import 'info.dart' show ClosureInfo;
-import 'rewriter.dart' show AstRewriter, BlockRewriter, InitializerRewriter;
+import 'rewriter.dart'
+ show
+ AstRewriter,
+ BlockRewriter,
+ InitializerRewriter,
+ FieldInitializerRewriter,
+ LocalInitializerRewriter;
class ClosureConverter extends Transformer {
final CoreTypes coreTypes;
@@ -195,18 +201,47 @@ 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) {
+ if (initializer is FieldInitializer || initializer is LocalInitializer) {
// Create a rewriter and a context for the initializer expression.
- rewriter = new InitializerRewriter(initializer.value);
+ 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`.
- Expression initializerExpression = initializer.value;
+ // 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
@@ -223,9 +258,11 @@ class ClosureConverter extends Transformer {
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' "
- "or a 'FieldInitializer'.";
+ ",a 'FieldInitializer', or a 'LocalInitializer'.";
}
}
}

Powered by Google App Engine
This is Rietveld 408576698