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 part of dart2js; | 5 part of dart2js; |
6 | 6 |
7 /// Enum for the visit methods added in [ResolvedVisitor]. | 7 /// Enum for the visit methods added in [ResolvedVisitor]. |
8 // TODO(johnniwinther): Remove this. | 8 // TODO(johnniwinther): Remove this. |
9 enum ResolvedKind { | 9 enum ResolvedKind { |
10 ASSERT, | 10 ASSERT, |
11 TYPE_LITERAL, | 11 TYPE_LITERAL, |
12 SUPER, | 12 SUPER, |
13 OPERATOR, | 13 OPERATOR, |
14 TYPE_PREFIX, | 14 TYPE_PREFIX, |
15 GETTER, | 15 GETTER, |
16 STATIC, | 16 STATIC, |
17 CLOSURE, | 17 CLOSURE, |
18 DYNAMIC, | 18 DYNAMIC, |
19 ERROR, | 19 ERROR, |
| 20 SEND_SET, |
| 21 NEW, |
20 } | 22 } |
21 | 23 |
22 /// Abstract interface for a [ResolvedVisitor]. | 24 /// Abstract interface for a [ResolvedVisitor]. |
23 // TODO(johnniwinther): Remove this. | 25 // TODO(johnniwinther): Remove this. |
24 abstract class ResolvedKindVisitor<R> { | 26 abstract class ResolvedKindVisitor<R> { |
25 R visitSuperSend(Send node); | 27 R visitSuperSend(Send node); |
26 R visitOperatorSend(Send node); | 28 R visitOperatorSend(Send node); |
27 R visitGetterSend(Send node); | 29 R visitGetterSend(Send node); |
28 R visitClosureSend(Send node); | 30 R visitClosureSend(Send node); |
29 R visitDynamicSend(Send node); | 31 R visitDynamicSend(Send node); |
30 R visitStaticSend(Send node); | 32 R visitStaticSend(Send node); |
| 33 R handleSendSet(SendSet node); |
| 34 R handleNewExpression(NewExpression node); |
31 | 35 |
32 /// Visitor callback for a type literal. | 36 /// Visitor callback for a type literal. |
33 R visitTypeLiteralSend(Send node); | 37 R visitTypeLiteralSend(Send node); |
34 | 38 |
35 /// Visitor callback for the class prefix of a static access, like `Foo` in | 39 /// Visitor callback for the class prefix of a static access, like `Foo` in |
36 /// `Foo.staticField`. | 40 /// `Foo.staticField`. |
37 // TODO(johnniwinther): Remove this when not needed by the dart backend. | 41 // TODO(johnniwinther): Remove this when not needed by the dart backend. |
38 R visitTypePrefixSend(Send node); | 42 R visitTypePrefixSend(Send node); |
39 | 43 |
40 R visitAssertSend(Send node); | 44 R visitAssertSend(Send node); |
41 | 45 |
42 internalError(Spannable node, String reason); | 46 internalError(Spannable node, String reason); |
43 } | 47 } |
44 | 48 |
45 /// Visitor that returns the [ResolvedKind] corresponding to the called visitor | 49 /// Visitor that returns the [ResolvedKind] corresponding to the called visitor |
46 /// method. | 50 /// method. |
47 class ResolvedKindComputer implements ResolvedKindVisitor { | 51 class ResolvedKindComputer implements ResolvedKindVisitor { |
48 const ResolvedKindComputer(); | 52 const ResolvedKindComputer(); |
49 | 53 |
50 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; | 54 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; |
51 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; | 55 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; |
52 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; | 56 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; |
53 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; | 57 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; |
54 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; | 58 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; |
55 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; | 59 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; |
56 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; | 60 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; |
57 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; | 61 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; |
58 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; | 62 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; |
| 63 ResolvedKind handleSendSet(SendSet node) => ResolvedKind.SEND_SET; |
| 64 ResolvedKind handleNewExpression(NewExpression node) => ResolvedKind.NEW; |
59 internalError(Spannable node, String reason) => ResolvedKind.ERROR; | 65 internalError(Spannable node, String reason) => ResolvedKind.ERROR; |
60 } | 66 } |
61 | 67 |
62 abstract class ResolvedVisitor<R> | 68 abstract class ResolvedVisitor<R> |
63 implements Visitor<R>, ResolvedKindVisitor<R> {} | 69 implements Visitor<R>, ResolvedKindVisitor<R> {} |
64 | 70 |
65 abstract class BaseResolvedVisitor<R> extends Visitor<R> | 71 abstract class BaseResolvedVisitor<R> extends Visitor<R> |
66 implements ResolvedVisitor<R> { | 72 implements ResolvedVisitor<R> { |
67 | 73 |
68 TreeElements elements; | 74 TreeElements elements; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 } | 129 } |
124 | 130 |
125 // TODO(johnniwinther): Remove this. Currently need by the old dart2dart | 131 // TODO(johnniwinther): Remove this. Currently need by the old dart2dart |
126 // backend. | 132 // backend. |
127 abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> { | 133 abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> { |
128 OldResolvedVisitor(TreeElements elements) : super(elements); | 134 OldResolvedVisitor(TreeElements elements) : super(elements); |
129 | 135 |
130 R visitSend(Send node) { | 136 R visitSend(Send node) { |
131 return _oldDispatch(node, this); | 137 return _oldDispatch(node, this); |
132 } | 138 } |
| 139 |
| 140 R visitSendSet(SendSet node) { |
| 141 return handleSendSet(node); |
| 142 } |
| 143 |
| 144 R visitNewExpression(NewExpression node) { |
| 145 return handleNewExpression(node); |
| 146 } |
133 } | 147 } |
134 | 148 |
135 abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> | 149 abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> |
136 with SendResolverMixin, | 150 with SendResolverMixin, |
137 GetBulkMixin<R, dynamic>, | 151 GetBulkMixin<R, dynamic>, |
138 SetBulkMixin<R, dynamic>, | 152 SetBulkMixin<R, dynamic>, |
139 ErrorBulkMixin<R, dynamic>, | 153 ErrorBulkMixin<R, dynamic>, |
140 InvokeBulkMixin<R, dynamic>, | 154 InvokeBulkMixin<R, dynamic>, |
141 IndexSetBulkMixin<R, dynamic>, | 155 IndexSetBulkMixin<R, dynamic>, |
142 CompoundBulkMixin<R, dynamic>, | 156 CompoundBulkMixin<R, dynamic>, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 if (sendStructure != null) { | 192 if (sendStructure != null) { |
179 var arg = sendVisitor == _resolvedKindDispatcher | 193 var arg = sendVisitor == _resolvedKindDispatcher |
180 ? kindVisitor : sendStructure; | 194 ? kindVisitor : sendStructure; |
181 return sendStructure.dispatch(sendVisitor, node, arg); | 195 return sendStructure.dispatch(sendVisitor, node, arg); |
182 } else { | 196 } else { |
183 return kindVisitor.visitStaticSend(node); | 197 return kindVisitor.visitStaticSend(node); |
184 } | 198 } |
185 } | 199 } |
186 } | 200 } |
187 | 201 |
| 202 bool checkResolvedKind(Node node, |
| 203 ResolvedKind oldKind, |
| 204 ResolvedKind newKind) { |
| 205 return invariant(node, oldKind == newKind, message: '$oldKind != $newKind'); |
| 206 } |
| 207 |
| 208 ResolvedKind computeResolvedKindFromStructure( |
| 209 Node node, SemanticSendStructure structure) { |
| 210 return structure.dispatch( |
| 211 _resolvedKindDispatcher, node, const ResolvedKindComputer()); |
| 212 } |
| 213 |
| 214 @override |
188 R visitSend(Send node) { | 215 R visitSend(Send node) { |
189 ResolvedKind oldKind; | 216 assert(checkResolvedKind( |
190 ResolvedKind newKind; | 217 node, |
191 assert(invariant(node, () { | 218 _oldDispatch(node, const ResolvedKindComputer()), |
192 oldKind = _oldDispatch(node, const ResolvedKindComputer()); | 219 _newDispatch(node, const ResolvedKindComputer(), |
193 newKind = _newDispatch( | 220 _resolvedKindDispatcher))); |
194 node, const ResolvedKindComputer(), _resolvedKindDispatcher); | |
195 return oldKind == newKind; | |
196 }, message: () => '$oldKind != $newKind')); | |
197 return _newDispatch(node, this, this); | 221 return _newDispatch(node, this, this); |
198 } | 222 } |
199 | 223 |
200 @override | 224 @override |
| 225 R visitSendSet(Send node) { |
| 226 SendStructure structure = computeSendStructure(node); |
| 227 if (structure == null) { |
| 228 return internalError(node, 'No structure for $node'); |
| 229 } else { |
| 230 assert(checkResolvedKind(node, |
| 231 ResolvedKind.SEND_SET, |
| 232 computeResolvedKindFromStructure(node, structure))); |
| 233 return structure.dispatch(this, node, structure); |
| 234 } |
| 235 } |
| 236 |
| 237 @override |
| 238 R visitNewExpression(NewExpression node) { |
| 239 NewStructure structure = computeNewStructure(node); |
| 240 if (structure == null) { |
| 241 return internalError(node, 'No structure for $node'); |
| 242 } else { |
| 243 assert(checkResolvedKind(node, |
| 244 ResolvedKind.NEW, |
| 245 computeResolvedKindFromStructure(node, structure))); |
| 246 return structure.dispatch(this, node, structure); |
| 247 } |
| 248 } |
| 249 |
| 250 @override |
201 R apply(Node node, arg) { | 251 R apply(Node node, arg) { |
202 return visitNode(node); | 252 return visitNode(node); |
203 } | 253 } |
204 | 254 |
205 @override | 255 @override |
206 R bulkHandleNode( | 256 R bulkHandleNode( |
207 Node node, | 257 Node node, |
208 String message, | 258 String message, |
209 SendStructure sendStructure) { | 259 SemanticSendStructure structure) { |
210 return sendStructure.dispatch(_semanticDispatcher, node, this); | 260 return structure.dispatch(_semanticDispatcher, node, this); |
211 } | 261 } |
212 } | 262 } |
213 | 263 |
214 /// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding | 264 /// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding |
215 /// visit methods in [ResolvedVisitor]. | 265 /// visit methods in [ResolvedVisitor]. |
216 class ResolvedSemanticDispatcher<R> extends Object | 266 class ResolvedSemanticDispatcher<R> extends Object |
217 with GetBulkMixin<R, ResolvedKindVisitor<R>>, | 267 with GetBulkMixin<R, ResolvedKindVisitor<R>>, |
218 SetBulkMixin<R, ResolvedKindVisitor<R>>, | 268 SetBulkMixin<R, ResolvedKindVisitor<R>>, |
219 InvokeBulkMixin<R, ResolvedKindVisitor<R>>, | 269 InvokeBulkMixin<R, ResolvedKindVisitor<R>>, |
220 PrefixBulkMixin<R, ResolvedKindVisitor<R>>, | 270 PrefixBulkMixin<R, ResolvedKindVisitor<R>>, |
(...skipping 11 matching lines...) Expand all Loading... |
232 R apply(Node node, ResolvedKindVisitor<R> visitor) { | 282 R apply(Node node, ResolvedKindVisitor<R> visitor) { |
233 return visitor.internalError( | 283 return visitor.internalError( |
234 node, "ResolvedSemanticDispatcher.apply unsupported."); | 284 node, "ResolvedSemanticDispatcher.apply unsupported."); |
235 } | 285 } |
236 | 286 |
237 @override | 287 @override |
238 R bulkHandleNode( | 288 R bulkHandleNode( |
239 Node node, | 289 Node node, |
240 String message, | 290 String message, |
241 ResolvedKindVisitor<R> visitor) { | 291 ResolvedKindVisitor<R> visitor) { |
242 // Set, Compound, IndexSet, and NewExpression are not handled by | |
243 // [ResolvedVisitor]. | |
244 return bulkHandleError(node, visitor); | 292 return bulkHandleError(node, visitor); |
245 } | 293 } |
246 | 294 |
247 R bulkHandleError(Node node, ResolvedKindVisitor<R> visitor) { | 295 R bulkHandleError(Node node, ResolvedKindVisitor<R> visitor) { |
248 return visitor.internalError(node, "No resolved kind for node."); | 296 if (node.asSendSet() != null) { |
| 297 return visitor.handleSendSet(node); |
| 298 } else if (node.asNewExpression() != null) { |
| 299 return visitor.handleNewExpression(node); |
| 300 } |
| 301 return visitor.internalError(node, "No resolved kind for $node."); |
249 } | 302 } |
250 | 303 |
251 @override | 304 @override |
252 R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) { | 305 R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) { |
253 return visitor.visitGetterSend(node); | 306 return visitor.visitGetterSend(node); |
254 } | 307 } |
255 | 308 |
256 @override | 309 @override |
257 R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) { | 310 R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) { |
258 // Most invokes are static. | 311 // Most invokes are static. |
259 return visitor.visitStaticSend(node); | 312 return visitor.visitStaticSend(node); |
260 } | 313 } |
261 | 314 |
262 @override | 315 @override |
263 R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) { | 316 R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) { |
264 return visitor.visitOperatorSend(node); | 317 return visitor.handleSendSet(node); |
265 } | 318 } |
266 | 319 |
267 @override | 320 @override |
268 R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) { | 321 R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) { |
269 return visitor.visitOperatorSend(node); | 322 return visitor.handleSendSet(node); |
270 } | 323 } |
271 | 324 |
272 @override | 325 @override |
273 R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) { | 326 R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) { |
| 327 if (node.asSendSet() != null) { |
| 328 return visitor.handleSendSet(node); |
| 329 } |
274 return visitor.visitSuperSend(node); | 330 return visitor.visitSuperSend(node); |
275 } | 331 } |
276 | 332 |
277 @override | 333 @override |
| 334 R bulkHandleSet(SendSet node, ResolvedKindVisitor<R> visitor) { |
| 335 return visitor.handleSendSet(node); |
| 336 } |
| 337 |
| 338 @override |
| 339 R bulkHandleCompound(SendSet node, ResolvedKindVisitor<R> visitor) { |
| 340 return visitor.handleSendSet(node); |
| 341 } |
| 342 |
| 343 @override |
| 344 R bulkHandleIndexSet(SendSet node, ResolvedKindVisitor<R> visitor) { |
| 345 return visitor.handleSendSet(node); |
| 346 } |
| 347 |
| 348 @override |
| 349 R bulkHandleNew(NewExpression node, ResolvedKindVisitor<R> visitor) { |
| 350 return visitor.handleNewExpression(node); |
| 351 } |
| 352 |
| 353 @override |
278 R errorInvalidAssert( | 354 R errorInvalidAssert( |
279 Send node, | 355 Send node, |
280 NodeList arguments, | 356 NodeList arguments, |
281 ResolvedKindVisitor<R> visitor) { | 357 ResolvedKindVisitor<R> visitor) { |
282 return visitor.visitAssertSend(node); | 358 return visitor.visitAssertSend(node); |
283 } | 359 } |
284 | 360 |
285 @override | 361 @override |
286 R errorLocalFunctionPostfix( | 362 R errorLocalFunctionPostfix( |
287 Send node, | 363 Send node, |
288 LocalFunctionElement function, | 364 LocalFunctionElement function, |
289 op.IncDecOperator operator, | 365 op.IncDecOperator operator, |
290 ResolvedKindVisitor<R> visitor) { | 366 ResolvedKindVisitor<R> visitor) { |
291 return visitor.visitOperatorSend(node); | 367 return visitor.handleSendSet(node); |
292 } | 368 } |
293 | 369 |
294 @override | 370 @override |
295 R errorLocalFunctionPrefix( | 371 R errorLocalFunctionPrefix( |
296 Send node, | 372 Send node, |
297 LocalFunctionElement function, | 373 LocalFunctionElement function, |
298 op.IncDecOperator operator, | 374 op.IncDecOperator operator, |
299 ResolvedKindVisitor<R> visitor) { | 375 ResolvedKindVisitor<R> visitor) { |
300 return visitor.visitOperatorSend(node); | 376 return visitor.handleSendSet(node); |
301 } | 377 } |
302 | 378 |
303 @override | 379 @override |
304 R errorStaticSetterGet( | 380 R errorStaticSetterGet( |
305 Send node, | 381 Send node, |
306 FunctionElement setter, | 382 FunctionElement setter, |
307 ResolvedKindVisitor<R> visitor) { | 383 ResolvedKindVisitor<R> visitor) { |
308 return visitor.visitGetterSend(node); | 384 return visitor.visitGetterSend(node); |
309 } | 385 } |
310 | 386 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 } | 472 } |
397 return visitor.visitStaticSend(node); | 473 return visitor.visitStaticSend(node); |
398 } | 474 } |
399 | 475 |
400 @override | 476 @override |
401 R errorUnresolvedPostfix( | 477 R errorUnresolvedPostfix( |
402 Send node, | 478 Send node, |
403 Element element, | 479 Element element, |
404 op.IncDecOperator operator, | 480 op.IncDecOperator operator, |
405 ResolvedKindVisitor<R> visitor) { | 481 ResolvedKindVisitor<R> visitor) { |
406 if (node.isSuperCall) { | 482 return visitor.handleSendSet(node); |
407 return visitor.visitSuperSend(node); | |
408 } | |
409 return visitor.visitOperatorSend(node); | |
410 } | 483 } |
411 | 484 |
412 @override | 485 @override |
413 R errorUnresolvedPrefix( | 486 R errorUnresolvedPrefix( |
414 Send node, | 487 Send node, |
415 Element element, | 488 Element element, |
416 op.IncDecOperator operator, | 489 op.IncDecOperator operator, |
417 ResolvedKindVisitor<R> visitor) { | 490 ResolvedKindVisitor<R> visitor) { |
418 if (node.isSuperCall) { | 491 return visitor.handleSendSet(node); |
419 return visitor.visitSuperSend(node); | |
420 } | |
421 return visitor.visitOperatorSend(node); | |
422 } | 492 } |
423 | 493 |
424 @override | 494 @override |
425 R errorUnresolvedSuperBinary( | 495 R errorUnresolvedSuperBinary( |
426 Send node, | 496 Send node, |
427 Element element, | 497 Element element, |
428 op.BinaryOperator operator, | 498 op.BinaryOperator operator, |
429 Node argument, | 499 Node argument, |
430 ResolvedKindVisitor<R> visitor) { | 500 ResolvedKindVisitor<R> visitor) { |
431 return visitor.visitSuperSend(node); | 501 return visitor.visitSuperSend(node); |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 | 768 |
699 @override | 769 @override |
700 R errorUnresolvedSuperIndex( | 770 R errorUnresolvedSuperIndex( |
701 Send node, | 771 Send node, |
702 Element function, | 772 Element function, |
703 Node index, | 773 Node index, |
704 ResolvedKindVisitor<R> visitor) { | 774 ResolvedKindVisitor<R> visitor) { |
705 return visitor.visitSuperSend(node); | 775 return visitor.visitSuperSend(node); |
706 } | 776 } |
707 } | 777 } |
OLD | NEW |