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

Side by Side Diff: pkg/kernel/lib/transformations/closure/rewriter.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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library kernel.transformations.closure.rewriter; 5 library kernel.transformations.closure.rewriter;
6 6
7 import '../../ast.dart'; 7 import '../../ast.dart';
8 import 'converter.dart' show ClosureConverter; 8 import 'converter.dart' show ClosureConverter;
9 9
10 /// Used by the [Context] to initialize and update the context variable 10 /// Used by the [Context] to initialize and update the context variable
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } 80 }
81 } 81 }
82 82
83 void insertExtendContext(VectorSet extender) { 83 void insertExtendContext(VectorSet extender) {
84 _insertStatement(new ExpressionStatement(extender)); 84 _insertStatement(new ExpressionStatement(extender));
85 } 85 }
86 } 86 }
87 87
88 /// Creates and updates the context as [Let] bindings around the initializer 88 /// Creates and updates the context as [Let] bindings around the initializer
89 /// expression. 89 /// expression.
90 class InitializerRewriter extends AstRewriter { 90 abstract class InitializerRewriter extends AstRewriter {
91 final Expression initializingExpression; 91 final Expression initializingExpression;
92 92
93 InitializerRewriter(this.initializingExpression) { 93 InitializerRewriter(this.initializingExpression);
94 assert(initializingExpression.parent is FieldInitializer);
95 }
96 94
97 @override 95 @override
98 BlockRewriter forNestedBlock(Block block) { 96 BlockRewriter forNestedBlock(Block block) {
99 return new BlockRewriter(block); 97 return new BlockRewriter(block);
100 } 98 }
101 99
102 @override 100 @override
103 void insertContextDeclaration(Expression accessParent) { 101 void insertContextDeclaration(Expression accessParent) {
104 _createDeclaration(); 102 _createDeclaration();
105 FieldInitializer parent = initializingExpression.parent;
106 Let binding = new Let(contextDeclaration, initializingExpression); 103 Let binding = new Let(contextDeclaration, initializingExpression);
104 setInitializerExpression(binding);
107 initializingExpression.parent = binding; 105 initializingExpression.parent = binding;
108 parent.value = binding;
109 binding.parent = parent;
110 } 106 }
111 107
112 @override 108 @override
113 void insertExtendContext(VectorSet extender) { 109 void insertExtendContext(VectorSet extender) {
114 Let parent = initializingExpression.parent; 110 Let parent = initializingExpression.parent;
115 Let binding = new Let(new VariableDeclaration(null, initializer: extender), 111 Let binding = new Let(new VariableDeclaration(null, initializer: extender),
116 initializingExpression); 112 initializingExpression);
117 parent.body = binding; 113 parent.body = binding;
118 binding.parent = parent; 114 binding.parent = parent;
119 } 115 }
116
117 void setInitializerExpression(Expression expression);
120 } 118 }
119
120 class FieldInitializerRewriter extends InitializerRewriter {
121 FieldInitializerRewriter(Expression initializingExpression)
122 : super(initializingExpression) {
123 assert(initializingExpression.parent is FieldInitializer);
124 }
125
126 void setInitializerExpression(Expression expression) {
127 assert(initializingExpression.parent is FieldInitializer);
128 FieldInitializer parent = initializingExpression.parent;
129 parent.value = expression;
130 expression.parent = parent;
131 }
132 }
133
134 class LocalInitializerRewriter extends InitializerRewriter {
135 LocalInitializerRewriter(Expression initializingExpression)
136 : super(initializingExpression) {
137 assert(initializingExpression.parent is LocalInitializer);
138 }
139
140 void setInitializerExpression(Expression expression) {
141 assert(initializingExpression.parent is LocalInitializer);
142 LocalInitializer parent = initializingExpression.parent;
143 parent.variable.initializer = expression;
144 expression.parent = parent;
145 }
146 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698