| 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 |