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, | 20 SEND_SET, |
21 NEW, | 21 NEW, |
| 22 SUPER_CONSTRUCTOR, |
22 } | 23 } |
23 | 24 |
24 /// Abstract interface for a [ResolvedVisitor]. | 25 /// Abstract interface for a [ResolvedVisitor]. |
25 // TODO(johnniwinther): Remove this. | 26 // TODO(johnniwinther): Remove this. |
26 abstract class ResolvedKindVisitor<R> { | 27 abstract class ResolvedKindVisitor<R> { |
27 R visitSuperSend(Send node); | 28 R visitSuperSend(Send node); |
28 | 29 |
29 @deprecated | 30 @deprecated |
30 R visitOperatorSend(Send node); | 31 R visitOperatorSend(Send node); |
31 R visitGetterSend(Send node); | 32 R visitGetterSend(Send node); |
32 | 33 |
33 @deprecated | 34 @deprecated |
34 R visitClosureSend(Send node); | 35 R visitClosureSend(Send node); |
35 R visitDynamicSend(Send node); | 36 R visitDynamicSend(Send node); |
36 R visitStaticSend(Send node); | 37 R visitStaticSend(Send node); |
| 38 |
| 39 R handleSuperConstructorInvoke(Send node); |
37 R handleSendSet(SendSet node); | 40 R handleSendSet(SendSet node); |
38 R handleNewExpression(NewExpression node); | 41 R handleNewExpression(NewExpression node); |
39 | 42 |
40 /// Visitor callback for a type literal. | 43 /// Visitor callback for a type literal. |
41 @deprecated | 44 @deprecated |
42 R visitTypeLiteralSend(Send node); | 45 R visitTypeLiteralSend(Send node); |
43 | 46 |
44 /// Visitor callback for the class prefix of a static access, like `Foo` in | 47 /// Visitor callback for the class prefix of a static access, like `Foo` in |
45 /// `Foo.staticField`. | 48 /// `Foo.staticField`. |
46 // TODO(johnniwinther): Remove this when not needed by the inferrer. | 49 // TODO(johnniwinther): Remove this when not needed by the inferrer. |
(...skipping 13 matching lines...) Expand all Loading... |
60 | 63 |
61 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; | 64 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; |
62 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; | 65 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; |
63 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; | 66 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; |
64 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; | 67 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; |
65 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; | 68 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; |
66 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; | 69 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; |
67 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; | 70 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; |
68 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; | 71 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; |
69 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; | 72 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; |
| 73 ResolvedKind handleSuperConstructorInvoke(Send node) { |
| 74 return ResolvedKind.SUPER_CONSTRUCTOR; |
| 75 } |
70 ResolvedKind handleSendSet(SendSet node) => ResolvedKind.SEND_SET; | 76 ResolvedKind handleSendSet(SendSet node) => ResolvedKind.SEND_SET; |
71 ResolvedKind handleNewExpression(NewExpression node) => ResolvedKind.NEW; | 77 ResolvedKind handleNewExpression(NewExpression node) => ResolvedKind.NEW; |
72 internalError(Spannable node, String reason) => ResolvedKind.ERROR; | 78 internalError(Spannable node, String reason) => ResolvedKind.ERROR; |
73 } | 79 } |
74 | 80 |
75 abstract class ResolvedVisitor<R> | 81 abstract class ResolvedVisitor<R> |
76 implements Visitor<R>, ResolvedKindVisitor<R> {} | 82 implements Visitor<R>, ResolvedKindVisitor<R> {} |
77 | 83 |
78 abstract class BaseResolvedVisitor<R> extends Visitor<R> | 84 abstract class BaseResolvedVisitor<R> extends Visitor<R> |
79 implements ResolvedVisitor<R> { | 85 implements ResolvedVisitor<R> { |
80 | 86 |
81 TreeElements elements; | 87 TreeElements elements; |
82 | 88 |
83 BaseResolvedVisitor(this.elements); | 89 BaseResolvedVisitor(this.elements); |
84 | 90 |
85 /// Dispatch using the old [ResolvedVisitor] logic. | 91 /// Dispatch using the old [ResolvedVisitor] logic. |
86 // TODO(johnniwinther): Remove this. | 92 // TODO(johnniwinther): Remove this. |
87 _oldDispatch(Send node, ResolvedKindVisitor visitor) { | 93 _oldDispatch(Send node, ResolvedKindVisitor visitor) { |
88 Element element = elements[node]; | 94 Element element = elements[node]; |
89 if (elements.isAssert(node)) { | 95 if (elements.isAssert(node)) { |
90 return visitor.visitAssertSend(node); | 96 return visitor.visitAssertSend(node); |
91 } else if (elements.isTypeLiteral(node)) { | 97 } else if (elements.isTypeLiteral(node)) { |
92 return visitor.visitTypeLiteralSend(node); | 98 return visitor.visitTypeLiteralSend(node); |
93 } else if (node.isSuperCall) { | 99 } else if (node.isSuperCall) { |
| 100 if (element != null && element.isConstructor) { |
| 101 return visitor.handleSuperConstructorInvoke(node); |
| 102 } |
94 return visitor.visitSuperSend(node); | 103 return visitor.visitSuperSend(node); |
95 } else if (node.isOperator) { | 104 } else if (node.isOperator) { |
96 return visitor.visitOperatorSend(node); | 105 return visitor.visitOperatorSend(node); |
97 } else if (node.isPropertyAccess) { | 106 } else if (node.isPropertyAccess) { |
98 if (!Elements.isUnresolved(element) && element.impliesType) { | 107 if (!Elements.isUnresolved(element) && element.impliesType) { |
99 return visitor.visitTypePrefixSend(node); | 108 return visitor.visitTypePrefixSend(node); |
100 } else { | 109 } else { |
101 return visitor.visitGetterSend(node); | 110 return visitor.visitGetterSend(node); |
102 } | 111 } |
103 } else if (element != null && Initializers.isConstructorRedirect(node)) { | 112 } else if (element != null && Initializers.isConstructorRedirect(node)) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 | 167 |
159 NewResolvedVisitor(TreeElements elements) : super(elements); | 168 NewResolvedVisitor(TreeElements elements) : super(elements); |
160 | 169 |
161 /// Dispatch using the new [SemanticSendVisitor] logic. | 170 /// Dispatch using the new [SemanticSendVisitor] logic. |
162 _newDispatch(Send node, | 171 _newDispatch(Send node, |
163 ResolvedKindVisitor kindVisitor, | 172 ResolvedKindVisitor kindVisitor, |
164 SemanticSendVisitor sendVisitor) { | 173 SemanticSendVisitor sendVisitor) { |
165 Element element = elements[node]; | 174 Element element = elements[node]; |
166 if (element != null && element.isConstructor) { | 175 if (element != null && element.isConstructor) { |
167 if (node.isSuperCall) { | 176 if (node.isSuperCall) { |
168 return kindVisitor.visitSuperSend(node); | 177 return kindVisitor.handleSuperConstructorInvoke(node); |
169 } else { | 178 } else { |
170 return kindVisitor.visitStaticSend(node); | 179 return kindVisitor.visitStaticSend(node); |
171 } | 180 } |
172 } else if (element != null && element.isPrefix) { | 181 } else if (element != null && element.isPrefix) { |
173 return kindVisitor.visitGetterSend(node); | 182 return kindVisitor.visitGetterSend(node); |
174 } else if (!elements.isTypeLiteral(node) && | 183 } else if (!elements.isTypeLiteral(node) && |
175 node.isPropertyAccess && | 184 node.isPropertyAccess && |
176 !Elements.isUnresolved(element) && | 185 !Elements.isUnresolved(element) && |
177 element.impliesType) { | 186 element.impliesType) { |
178 return kindVisitor.visitTypePrefixSend(node); | 187 return kindVisitor.visitTypePrefixSend(node); |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 Node expression, | 470 Node expression, |
462 ResolvedKindVisitor<R> visitor) { | 471 ResolvedKindVisitor<R> visitor) { |
463 return visitor.visitOperatorSend(node); | 472 return visitor.visitOperatorSend(node); |
464 } | 473 } |
465 | 474 |
466 @override | 475 @override |
467 R errorUnresolvedGet( | 476 R errorUnresolvedGet( |
468 Send node, | 477 Send node, |
469 Element element, | 478 Element element, |
470 ResolvedKindVisitor<R> visitor) { | 479 ResolvedKindVisitor<R> visitor) { |
471 if (node.isSuperCall) { | |
472 return visitor.visitSuperSend(node); | |
473 } | |
474 return visitor.visitGetterSend(node); | 480 return visitor.visitGetterSend(node); |
475 } | 481 } |
476 | 482 |
477 @override | 483 @override |
478 R errorUnresolvedInvoke( | 484 R errorUnresolvedInvoke( |
479 Send node, | 485 Send node, |
480 Element element, | 486 Element element, |
481 NodeList arguments, | 487 NodeList arguments, |
482 Selector selector, | 488 Selector selector, |
483 ResolvedKindVisitor<R> visitor) { | 489 ResolvedKindVisitor<R> visitor) { |
484 if (node.isSuperCall) { | |
485 return visitor.visitSuperSend(node); | |
486 } | |
487 return visitor.visitStaticSend(node); | 490 return visitor.visitStaticSend(node); |
488 } | 491 } |
489 | 492 |
490 @override | 493 @override |
491 R errorUnresolvedPostfix( | 494 R errorUnresolvedPostfix( |
492 Send node, | 495 Send node, |
493 Element element, | 496 Element element, |
494 op.IncDecOperator operator, | 497 op.IncDecOperator operator, |
495 ResolvedKindVisitor<R> visitor) { | 498 ResolvedKindVisitor<R> visitor) { |
496 return visitor.handleSendSet(node); | 499 return visitor.handleSendSet(node); |
497 } | 500 } |
498 | 501 |
499 @override | 502 @override |
500 R errorUnresolvedPrefix( | 503 R errorUnresolvedPrefix( |
501 Send node, | 504 Send node, |
502 Element element, | 505 Element element, |
503 op.IncDecOperator operator, | 506 op.IncDecOperator operator, |
504 ResolvedKindVisitor<R> visitor) { | 507 ResolvedKindVisitor<R> visitor) { |
505 return visitor.handleSendSet(node); | 508 return visitor.handleSendSet(node); |
506 } | 509 } |
507 | 510 |
508 @override | 511 @override |
509 R errorUnresolvedSuperBinary( | |
510 Send node, | |
511 Element element, | |
512 op.BinaryOperator operator, | |
513 Node argument, | |
514 ResolvedKindVisitor<R> visitor) { | |
515 return visitor.visitSuperSend(node); | |
516 } | |
517 | |
518 @override | |
519 R errorUnresolvedSuperUnary( | |
520 Send node, | |
521 op.UnaryOperator operator, | |
522 Element element, | |
523 ResolvedKindVisitor<R> visitor) { | |
524 return visitor.visitSuperSend(node); | |
525 } | |
526 | |
527 @override | |
528 R visitAs( | 512 R visitAs( |
529 Send node, | 513 Send node, |
530 Node expression, | 514 Node expression, |
531 DartType type, | 515 DartType type, |
532 ResolvedKindVisitor<R> visitor) { | 516 ResolvedKindVisitor<R> visitor) { |
533 return visitor.visitOperatorSend(node); | 517 return visitor.visitOperatorSend(node); |
534 } | 518 } |
535 | 519 |
536 @override | 520 @override |
537 R visitAssert( | 521 R visitAssert( |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 } | 756 } |
773 | 757 |
774 @override | 758 @override |
775 R visitSuperIndex( | 759 R visitSuperIndex( |
776 Send node, | 760 Send node, |
777 FunctionElement function, | 761 FunctionElement function, |
778 Node index, | 762 Node index, |
779 ResolvedKindVisitor<R> visitor) { | 763 ResolvedKindVisitor<R> visitor) { |
780 return visitor.visitSuperSend(node); | 764 return visitor.visitSuperSend(node); |
781 } | 765 } |
782 | |
783 @override | |
784 R errorUnresolvedSuperIndex( | |
785 Send node, | |
786 Element function, | |
787 Node index, | |
788 ResolvedKindVisitor<R> visitor) { | |
789 return visitor.visitSuperSend(node); | |
790 } | |
791 } | 766 } |
OLD | NEW |