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

Unified Diff: pkg/kernel/lib/transformations/closure/rewriter.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
« no previous file with comments | « pkg/kernel/lib/transformations/closure/info.dart ('k') | pkg/kernel/test/closures_initializers/suite.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/kernel/lib/transformations/closure/rewriter.dart
diff --git a/pkg/kernel/lib/transformations/closure/rewriter.dart b/pkg/kernel/lib/transformations/closure/rewriter.dart
index 82c4e6cbf019806fd79d3d01185076d9704792bc..5f88d97efb5d38f581902af584b4cb19066cdaab 100644
--- a/pkg/kernel/lib/transformations/closure/rewriter.dart
+++ b/pkg/kernel/lib/transformations/closure/rewriter.dart
@@ -85,12 +85,11 @@ class BlockRewriter extends AstRewriter {
}
}
-/// Creates and updates the context as [Let] bindings around the initializer
-/// expression.
-abstract class InitializerRewriter extends AstRewriter {
- final Expression initializingExpression;
+class InitializerListRewriter extends AstRewriter {
+ final Constructor parentConstructor;
+ final List<Initializer> prefix = [];
- InitializerRewriter(this.initializingExpression);
+ InitializerListRewriter(this.parentConstructor);
@override
BlockRewriter forNestedBlock(Block block) {
@@ -100,44 +99,16 @@ abstract class InitializerRewriter extends AstRewriter {
@override
void insertContextDeclaration(Expression accessParent) {
_createDeclaration();
- var oldParent = initializingExpression.parent;
- Let binding = new Let(contextDeclaration, initializingExpression);
- binding.parent = oldParent;
- setInitializerExpression(binding);
+ var init = new LocalInitializer(contextDeclaration);
+ init.parent = parentConstructor;
+ prefix.add(init);
}
@override
void insertExtendContext(VectorSet extender) {
- Let parent = initializingExpression.parent;
- Let binding = new Let(new VariableDeclaration(null, initializer: extender),
- initializingExpression);
- parent.body = binding;
- binding.parent = parent;
- }
-
- void setInitializerExpression(Expression expression);
-}
-
-class FieldInitializerRewriter extends InitializerRewriter {
- FieldInitializerRewriter(Expression initializingExpression)
- : super(initializingExpression) {
- assert(initializingExpression.parent is FieldInitializer);
- }
-
- void setInitializerExpression(Expression expression) {
- (expression.parent as FieldInitializer).value = expression;
- }
-}
-
-class LocalInitializerRewriter extends InitializerRewriter {
- LocalInitializerRewriter(Expression initializingExpression)
- : super(initializingExpression) {
- // The initializer is up two levels because the variable declaration node is
- // in between.
- assert(initializingExpression.parent.parent is LocalInitializer);
- }
-
- void setInitializerExpression(Expression expression) {
- (expression.parent as VariableDeclaration).initializer = expression;
+ var init = new LocalInitializer(
+ new VariableDeclaration(null, initializer: extender));
+ init.parent = parentConstructor;
+ prefix.add(init);
}
}
« no previous file with comments | « pkg/kernel/lib/transformations/closure/info.dart ('k') | pkg/kernel/test/closures_initializers/suite.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698