OLD | NEW |
---|---|
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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.info; | 5 library kernel.transformations.closure.info; |
6 | 6 |
7 import '../../ast.dart' | 7 import '../../ast.dart' |
8 show | 8 show |
9 Class, | 9 Class, |
10 Constructor, | 10 Constructor, |
11 Field, | 11 Field, |
12 FieldInitializer, | |
12 FunctionDeclaration, | 13 FunctionDeclaration, |
13 FunctionNode, | 14 FunctionNode, |
15 LocalInitializer, | |
14 Member, | 16 Member, |
15 Name, | 17 Name, |
16 Procedure, | 18 Procedure, |
17 ProcedureKind, | 19 ProcedureKind, |
18 PropertyGet, | 20 PropertyGet, |
21 RedirectingInitializer, | |
22 SuperInitializer, | |
19 ThisExpression, | 23 ThisExpression, |
20 TypeParameter, | 24 TypeParameter, |
21 TypeParameterType, | 25 TypeParameterType, |
22 VariableDeclaration, | 26 VariableDeclaration, |
23 VariableGet, | 27 VariableGet, |
24 VariableSet; | 28 VariableSet; |
25 | 29 |
26 import '../../visitor.dart' show RecursiveVisitor; | 30 import '../../visitor.dart' show RecursiveVisitor; |
27 | 31 |
28 class ClosureInfo extends RecursiveVisitor { | 32 class ClosureInfo extends RecursiveVisitor { |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
202 if (!isOuterMostContext) { | 206 if (!isOuterMostContext) { |
203 thisAccess.putIfAbsent( | 207 thisAccess.putIfAbsent( |
204 currentMemberFunction, () => new VariableDeclaration("#self")); | 208 currentMemberFunction, () => new VariableDeclaration("#self")); |
205 } | 209 } |
206 } | 210 } |
207 | 211 |
208 visitPropertyGet(PropertyGet node) { | 212 visitPropertyGet(PropertyGet node) { |
209 invokedGetters.add(node.name); | 213 invokedGetters.add(node.name); |
210 super.visitPropertyGet(node); | 214 super.visitPropertyGet(node); |
211 } | 215 } |
216 | |
217 visitFieldInitializer(FieldInitializer node) { | |
karlklose
2017/06/16 07:54:43
Consider adding a helper and move the comment ther
Dmitry Stefantsov
2017/06/16 08:30:00
Thanks! I agree, an example could help with under
| |
218 // Set [currentFunction] to [currentMemberFunction] during visiting the | |
219 // initializer. Effectively it means that [currentFunction] is set to | |
220 // [function] field of the constructor, and constructor parameters | |
221 // encountered in the initializer won't be treated as captured. | |
222 // Same trick is used in [visitSuperInitializer], | |
223 // [visitRedirectingInitializer], and [visitLocalInitializer]. | |
224 var saved = currentFunction; | |
225 currentFunction = currentMemberFunction; | |
226 super.visitFieldInitializer(node); | |
227 currentFunction = saved; | |
228 } | |
229 | |
230 visitSuperInitializer(SuperInitializer node) { | |
231 var saved = currentFunction; | |
232 currentFunction = currentMemberFunction; | |
233 super.visitSuperInitializer(node); | |
234 currentFunction = saved; | |
235 } | |
236 | |
237 visitRedirectingInitializer(RedirectingInitializer node) { | |
238 var saved = currentFunction; | |
239 currentFunction = currentMemberFunction; | |
240 super.visitRedirectingInitializer(node); | |
241 currentFunction = saved; | |
242 } | |
243 | |
244 visitLocalInitializer(LocalInitializer node) { | |
245 var saved = currentFunction; | |
246 currentFunction = currentMemberFunction; | |
247 super.visitLocalInitializer(node); | |
248 currentFunction = saved; | |
249 } | |
212 } | 250 } |
OLD | NEW |