| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 interface TreeElements { | 5 interface TreeElements { |
| 6 Element operator[](Node node); | 6 Element operator[](Node node); |
| 7 Selector getSelector(Send send); | 7 Selector getSelector(Send send); |
| 8 } | 8 } |
| 9 | 9 |
| 10 class TreeElementMapping implements TreeElements { | 10 class TreeElementMapping implements TreeElements { |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 } else { | 631 } else { |
| 632 visit(node.argumentsNode); | 632 visit(node.argumentsNode); |
| 633 mapping.setSelector(node, Selector.BINARY_OPERATOR); | 633 mapping.setSelector(node, Selector.BINARY_OPERATOR); |
| 634 } | 634 } |
| 635 } else if (node.isIndex) { | 635 } else if (node.isIndex) { |
| 636 visit(node.argumentsNode); | 636 visit(node.argumentsNode); |
| 637 assert(node.arguments.tail.isEmpty()); | 637 assert(node.arguments.tail.isEmpty()); |
| 638 mapping.setSelector(node, Selector.INDEX); | 638 mapping.setSelector(node, Selector.INDEX); |
| 639 } else if (node.isPropertyAccess) { | 639 } else if (node.isPropertyAccess) { |
| 640 mapping.setSelector(node, Selector.GETTER); | 640 mapping.setSelector(node, Selector.GETTER); |
| 641 if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 642 AbstractFieldElement field = target; |
| 643 target = field.getter; |
| 644 } |
| 641 } else { | 645 } else { |
| 642 handleArguments(node); | 646 handleArguments(node); |
| 643 } | 647 } |
| 644 // TODO(ngeoffray): If target is a field, check that there's a | 648 // TODO(ngeoffray): Warn if target is null and the send is |
| 645 // getter. | 649 // unqualified. |
| 646 return useElement(node, target); | 650 return useElement(node, target); |
| 647 } | 651 } |
| 648 | 652 |
| 649 visitSendSet(SendSet node) { | 653 visitSendSet(SendSet node) { |
| 650 Element target = resolveSend(node); | 654 Element target = resolveSend(node); |
| 651 visit(node.argumentsNode); | 655 Element setter = null; |
| 652 // TODO(ngeoffray): If target is a field, check that there's a | 656 Element getter = null; |
| 653 // setter. | 657 if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 658 AbstractFieldElement field = target; |
| 659 setter = field.setter; |
| 660 getter = field.getter; |
| 661 } else { |
| 662 setter = target; |
| 663 getter = target; |
| 664 } |
| 654 // TODO(ngeoffray): Check if the target can be assigned. | 665 // TODO(ngeoffray): Check if the target can be assigned. |
| 655 Identifier op = node.assignmentOperator; | 666 Identifier op = node.assignmentOperator; |
| 656 bool needsGetter = op.source.stringValue !== '='; | 667 bool needsGetter = op.source.stringValue !== '='; |
| 657 Selector selector; | 668 Selector selector; |
| 658 if (needsGetter) { | 669 if (needsGetter) { |
| 659 // Resolve the getter for the lhs (receiver+selector). | |
| 660 // Currently this is the same as the setter. | |
| 661 // TODO(ngeoffray): Adapt for fields. | |
| 662 Element getter; | |
| 663 if (node.isIndex) { | 670 if (node.isIndex) { |
| 664 selector = Selector.INDEX_AND_INDEX_SET; | 671 selector = Selector.INDEX_AND_INDEX_SET; |
| 665 getter = target; | |
| 666 } else { | 672 } else { |
| 667 selector = Selector.GETTER_AND_SETTER; | 673 selector = Selector.GETTER_AND_SETTER; |
| 668 // TODO(ngeoffray): Find the getter from the setter. | |
| 669 getter = target; | |
| 670 } | 674 } |
| 671 useElement(node.selector, getter); | 675 useElement(node.selector, getter); |
| 672 } else if (node.isIndex) { | 676 } else if (node.isIndex) { |
| 673 selector = Selector.INDEX_SET; | 677 selector = Selector.INDEX_SET; |
| 674 } else { | 678 } else { |
| 675 selector = Selector.SETTER; | 679 selector = Selector.SETTER; |
| 676 } | 680 } |
| 681 visit(node.argumentsNode); |
| 677 mapping.setSelector(node, selector); | 682 mapping.setSelector(node, selector); |
| 678 return useElement(node, target); | 683 // TODO(ngeoffray): Warn if target is null and the send is |
| 684 // unqualified. |
| 685 return useElement(node, setter); |
| 679 } | 686 } |
| 680 | 687 |
| 681 visitLiteralInt(LiteralInt node) { | 688 visitLiteralInt(LiteralInt node) { |
| 682 } | 689 } |
| 683 | 690 |
| 684 visitLiteralDouble(LiteralDouble node) { | 691 visitLiteralDouble(LiteralDouble node) { |
| 685 } | 692 } |
| 686 | 693 |
| 687 visitLiteralBool(LiteralBool node) { | 694 visitLiteralBool(LiteralBool node) { |
| 688 } | 695 } |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1154 class TopScope extends Scope { | 1161 class TopScope extends Scope { |
| 1155 Universe universe; | 1162 Universe universe; |
| 1156 | 1163 |
| 1157 TopScope(Universe this.universe) : super(null, null); | 1164 TopScope(Universe this.universe) : super(null, null); |
| 1158 Element lookup(SourceString name) => universe.find(name); | 1165 Element lookup(SourceString name) => universe.find(name); |
| 1159 | 1166 |
| 1160 Element add(Element element) { | 1167 Element add(Element element) { |
| 1161 throw "Cannot add an element in the top scope"; | 1168 throw "Cannot add an element in the top scope"; |
| 1162 } | 1169 } |
| 1163 } | 1170 } |
| OLD | NEW |