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.converter; | 5 library kernel.transformations.closure.converter; |
6 | 6 |
7 import '../../ast.dart' | 7 import '../../ast.dart' |
8 show | 8 show |
9 Arguments, | 9 Arguments, |
10 Block, | 10 Block, |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 import 'clone_without_body.dart' show CloneWithoutBody; | 67 import 'clone_without_body.dart' show CloneWithoutBody; |
68 | 68 |
69 import 'context.dart' show Context, NoContext; | 69 import 'context.dart' show Context, NoContext; |
70 | 70 |
71 import 'info.dart' show ClosureInfo; | 71 import 'info.dart' show ClosureInfo; |
72 | 72 |
73 import 'rewriter.dart' show AstRewriter, BlockRewriter, InitializerRewriter; | 73 import 'rewriter.dart' show AstRewriter, BlockRewriter, InitializerRewriter; |
74 | 74 |
75 class ClosureConverter extends Transformer { | 75 class ClosureConverter extends Transformer { |
76 final CoreTypes coreTypes; | 76 final CoreTypes coreTypes; |
77 final Class contextClass; | |
78 final Set<VariableDeclaration> capturedVariables; | 77 final Set<VariableDeclaration> capturedVariables; |
79 final Map<FunctionNode, Set<TypeParameter>> capturedTypeVariables; | 78 final Map<FunctionNode, Set<TypeParameter>> capturedTypeVariables; |
80 final Map<FunctionNode, VariableDeclaration> thisAccess; | 79 final Map<FunctionNode, VariableDeclaration> thisAccess; |
81 final Map<FunctionNode, String> localNames; | 80 final Map<FunctionNode, String> localNames; |
82 | 81 |
83 /// Records place-holders for cloning contexts. See [visitForStatement]. | 82 /// Records place-holders for cloning contexts. See [visitForStatement]. |
84 final Set<InvalidExpression> contextClonePlaceHolders = | 83 final Set<InvalidExpression> contextClonePlaceHolders = |
85 new Set<InvalidExpression>(); | 84 new Set<InvalidExpression>(); |
86 | 85 |
87 /// Maps the names of all instance methods that may be torn off (aka | 86 /// Maps the names of all instance methods that may be torn off (aka |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 /// } | 128 /// } |
130 /// class Closure#0<T_> implements Function { | 129 /// class Closure#0<T_> implements Function { |
131 /// call(x) => x is T_; | 130 /// call(x) => x is T_; |
132 /// } | 131 /// } |
133 /// | 132 /// |
134 /// In this example, `typeSubstitution[T].parameter == T_` when transforming | 133 /// In this example, `typeSubstitution[T].parameter == T_` when transforming |
135 /// the closure in `f`. | 134 /// the closure in `f`. |
136 Map<TypeParameter, DartType> typeSubstitution = | 135 Map<TypeParameter, DartType> typeSubstitution = |
137 const <TypeParameter, DartType>{}; | 136 const <TypeParameter, DartType>{}; |
138 | 137 |
139 ClosureConverter(this.coreTypes, ClosureInfo info, this.contextClass) | 138 ClosureConverter(this.coreTypes, ClosureInfo info) |
140 : this.capturedVariables = info.variables, | 139 : this.capturedVariables = info.variables, |
141 this.capturedTypeVariables = info.typeVariables, | 140 this.capturedTypeVariables = info.typeVariables, |
142 this.thisAccess = info.thisAccess, | 141 this.thisAccess = info.thisAccess, |
143 this.localNames = info.localNames, | 142 this.localNames = info.localNames, |
144 this.tearOffGetterNames = info.tearOffGetterNames; | 143 this.tearOffGetterNames = info.tearOffGetterNames; |
145 | 144 |
146 bool get isOuterMostContext { | 145 bool get isOuterMostContext { |
147 return currentFunction == null || currentMemberFunction == currentFunction; | 146 return currentFunction == null || currentMemberFunction == currentFunction; |
148 } | 147 } |
149 | 148 |
(...skipping 10 matching lines...) Expand all Loading... |
160 try { | 159 try { |
161 return f(); | 160 return f(); |
162 } finally { | 161 } finally { |
163 rewriter = old; | 162 rewriter = old; |
164 context = savedContext; | 163 context = savedContext; |
165 } | 164 } |
166 } | 165 } |
167 | 166 |
168 TreeNode visitLibrary(Library node) { | 167 TreeNode visitLibrary(Library node) { |
169 assert(newLibraryMembers.isEmpty); | 168 assert(newLibraryMembers.isEmpty); |
170 if (node == contextClass.enclosingLibrary) return node; | |
171 | 169 |
172 currentLibrary = node; | 170 currentLibrary = node; |
173 node = super.visitLibrary(node); | 171 node = super.visitLibrary(node); |
174 for (TreeNode member in newLibraryMembers) { | 172 for (TreeNode member in newLibraryMembers) { |
175 if (member is Class) { | 173 if (member is Class) { |
176 node.addClass(member); | 174 node.addClass(member); |
177 } else { | 175 } else { |
178 node.addMember(member); | 176 node.addMember(member); |
179 } | 177 } |
180 } | 178 } |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 newClassMembers.add(tearOffMethod); | 876 newClassMembers.add(tearOffMethod); |
879 | 877 |
880 resetContext(); | 878 resetContext(); |
881 }); | 879 }); |
882 } finally { | 880 } finally { |
883 currentMember = oldCurrentMember; | 881 currentMember = oldCurrentMember; |
884 currentMemberFunction = oldCurrentMemberFunction; | 882 currentMemberFunction = oldCurrentMemberFunction; |
885 } | 883 } |
886 } | 884 } |
887 } | 885 } |
OLD | NEW |