OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 types; | 5 library types; |
6 | 6 |
7 import '../common.dart' show failedAt; | 7 import '../common.dart' show failedAt; |
8 import '../common/tasks.dart' show CompilerTask; | 8 import '../common/tasks.dart' show CompilerTask; |
9 import '../compiler.dart' show Compiler; | 9 import '../compiler.dart' show Compiler; |
10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 | 138 |
139 TypeMask get returnType => | 139 TypeMask get returnType => |
140 _isJsInterop ? _dynamic : _inferrer.getReturnTypeOfParameter(_owner); | 140 _isJsInterop ? _dynamic : _inferrer.getReturnTypeOfParameter(_owner); |
141 | 141 |
142 TypeMask get type => | 142 TypeMask get type => |
143 _isJsInterop ? _dynamic : _inferrer.getTypeOfParameter(_owner); | 143 _isJsInterop ? _dynamic : _inferrer.getTypeOfParameter(_owner); |
144 } | 144 } |
145 | 145 |
146 /// Internal data used during type-inference to store intermediate results about | 146 /// Internal data used during type-inference to store intermediate results about |
147 /// a single element. | 147 /// a single element. |
148 class GlobalTypeInferenceElementData { | 148 abstract class GlobalTypeInferenceElementData<T> { |
| 149 TypeMask typeOfSend(T node); |
| 150 TypeMask typeOfGetter(T node); |
| 151 TypeMask typeOfOperator(T node); |
| 152 |
| 153 void setTypeMask(T node, TypeMask mask); |
| 154 |
| 155 void setGetterTypeMaskInComplexSendSet(T node, TypeMask mask); |
| 156 |
| 157 void setOperatorTypeMaskInComplexSendSet(T node, TypeMask mask); |
| 158 |
| 159 TypeMask typeOfIterator(T node); |
| 160 |
| 161 TypeMask typeOfIteratorMoveNext(T node); |
| 162 |
| 163 TypeMask typeOfIteratorCurrent(T node); |
| 164 |
| 165 void setIteratorTypeMask(T node, TypeMask mask); |
| 166 |
| 167 void setMoveNextTypeMask(T node, TypeMask mask); |
| 168 |
| 169 void setCurrentTypeMask(T node, TypeMask mask); |
| 170 } |
| 171 |
| 172 class AstGlobalTypeInferenceElementData |
| 173 extends GlobalTypeInferenceElementData<Node> { |
149 Map<Object, TypeMask> _typeMasks; | 174 Map<Object, TypeMask> _typeMasks; |
150 | 175 |
151 TypeMask _get(Object node) => _typeMasks != null ? _typeMasks[node] : null; | 176 TypeMask _get(Object node) => _typeMasks != null ? _typeMasks[node] : null; |
152 void _set(Object node, TypeMask mask) { | 177 void _set(Object node, TypeMask mask) { |
153 _typeMasks ??= new Maplet<Object, TypeMask>(); | 178 _typeMasks ??= new Maplet<Object, TypeMask>(); |
154 _typeMasks[node] = mask; | 179 _typeMasks[node] = mask; |
155 } | 180 } |
156 | 181 |
157 TypeMask typeOfSend(Send node) => _get(node); | 182 TypeMask typeOfSend(covariant Send node) => _get(node); |
158 TypeMask typeOfGetter(SendSet node) => _get(node.selector); | 183 TypeMask typeOfGetter(covariant SendSet node) => _get(node.selector); |
159 TypeMask typeOfOperator(SendSet node) => _get(node.assignmentOperator); | 184 TypeMask typeOfOperator(covariant SendSet node) => |
| 185 _get(node.assignmentOperator); |
160 | 186 |
161 void setTypeMask(Send node, TypeMask mask) { | 187 void setTypeMask(covariant Send node, TypeMask mask) { |
162 _set(node, mask); | 188 _set(node, mask); |
163 } | 189 } |
164 | 190 |
165 void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask) { | 191 void setGetterTypeMaskInComplexSendSet( |
| 192 covariant SendSet node, TypeMask mask) { |
166 _set(node.selector, mask); | 193 _set(node.selector, mask); |
167 } | 194 } |
168 | 195 |
169 void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask) { | 196 void setOperatorTypeMaskInComplexSendSet( |
| 197 covariant SendSet node, TypeMask mask) { |
170 _set(node.assignmentOperator, mask); | 198 _set(node.assignmentOperator, mask); |
171 } | 199 } |
172 | 200 |
173 // TODO(sigmund): clean up. We store data about 3 selectors for "for in" | 201 // TODO(sigmund): clean up. We store data about 3 selectors for "for in" |
174 // nodes: the iterator, move-next, and current element. Because our map keys | 202 // nodes: the iterator, move-next, and current element. Because our map keys |
175 // are nodes, we need to fabricate different keys to keep these selectors | 203 // are nodes, we need to fabricate different keys to keep these selectors |
176 // separate. The current implementation does this by using | 204 // separate. The current implementation does this by using |
177 // children of the for-in node (these children were picked arbitrarily). | 205 // children of the for-in node (these children were picked arbitrarily). |
178 | 206 |
179 TypeMask typeOfIterator(ForIn node) => _get(node); | 207 TypeMask typeOfIterator(covariant ForIn node) => _get(node); |
180 | 208 |
181 TypeMask typeOfIteratorMoveNext(ForIn node) => _get(node.forToken); | 209 TypeMask typeOfIteratorMoveNext(covariant ForIn node) => _get(node.forToken); |
182 | 210 |
183 TypeMask typeOfIteratorCurrent(ForIn node) => _get(node.inToken); | 211 TypeMask typeOfIteratorCurrent(covariant ForIn node) => _get(node.inToken); |
184 | 212 |
185 void setIteratorTypeMask(ForIn node, TypeMask mask) { | 213 void setIteratorTypeMask(covariant ForIn node, TypeMask mask) { |
186 _set(node, mask); | 214 _set(node, mask); |
187 } | 215 } |
188 | 216 |
189 void setMoveNextTypeMask(ForIn node, TypeMask mask) { | 217 void setMoveNextTypeMask(covariant ForIn node, TypeMask mask) { |
190 _set(node.forToken, mask); | 218 _set(node.forToken, mask); |
191 } | 219 } |
192 | 220 |
193 void setCurrentTypeMask(ForIn node, TypeMask mask) { | 221 void setCurrentTypeMask(covariant ForIn node, TypeMask mask) { |
194 _set(node.inToken, mask); | 222 _set(node.inToken, mask); |
195 } | 223 } |
196 } | 224 } |
197 | 225 |
198 /// API to interact with the global type-inference engine. | 226 /// API to interact with the global type-inference engine. |
199 abstract class TypesInferrer { | 227 abstract class TypesInferrer { |
200 void analyzeMain(FunctionEntity element); | 228 void analyzeMain(FunctionEntity element); |
201 TypeMask getReturnTypeOfMember(MemberElement element); | 229 TypeMask getReturnTypeOfMember(MemberElement element); |
202 TypeMask getReturnTypeOfParameter(ParameterElement element); | 230 TypeMask getReturnTypeOfParameter(ParameterElement element); |
203 TypeMask getTypeOfMember(MemberElement element); | 231 TypeMask getTypeOfMember(MemberElement element); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 measure(() { | 326 measure(() { |
299 typesInferrerInternal ??= | 327 typesInferrerInternal ??= |
300 new TypeGraphInferrer(compiler, closedWorld, closedWorldRefiner); | 328 new TypeGraphInferrer(compiler, closedWorld, closedWorldRefiner); |
301 typesInferrerInternal.analyzeMain(mainElement); | 329 typesInferrerInternal.analyzeMain(mainElement); |
302 typesInferrerInternal.clear(); | 330 typesInferrerInternal.clear(); |
303 results = | 331 results = |
304 new GlobalTypeInferenceResults(typesInferrerInternal, closedWorld); | 332 new GlobalTypeInferenceResults(typesInferrerInternal, closedWorld); |
305 }); | 333 }); |
306 } | 334 } |
307 } | 335 } |
OLD | NEW |