Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Side by Side Diff: frog/leg/resolver.dart

Issue 9245002: Support getters and setters. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 } else { 620 } else {
621 visit(node.argumentsNode); 621 visit(node.argumentsNode);
622 mapping.setSelector(node, Selector.BINARY_OPERATOR); 622 mapping.setSelector(node, Selector.BINARY_OPERATOR);
623 } 623 }
624 } else if (node.isIndex) { 624 } else if (node.isIndex) {
625 visit(node.argumentsNode); 625 visit(node.argumentsNode);
626 assert(node.arguments.tail.isEmpty()); 626 assert(node.arguments.tail.isEmpty());
627 mapping.setSelector(node, Selector.INDEX); 627 mapping.setSelector(node, Selector.INDEX);
628 } else if (node.isPropertyAccess) { 628 } else if (node.isPropertyAccess) {
629 mapping.setSelector(node, Selector.GETTER); 629 mapping.setSelector(node, Selector.GETTER);
630 if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) {
631 AbstractFieldElement field = target;
632 target = field.getter;
633 }
630 } else { 634 } else {
631 handleArguments(node); 635 handleArguments(node);
632 } 636 }
633 // TODO(ngeoffray): If target is a field, check that there's a 637 // TODO(ngeoffray): Warn if target is null and the send is
634 // getter. 638 // unqualified.
635 return useElement(node, target); 639 return useElement(node, target);
636 } 640 }
637 641
638 visitSendSet(SendSet node) { 642 visitSendSet(SendSet node) {
639 Element target = resolveSend(node); 643 Element target = resolveSend(node);
640 visit(node.argumentsNode); 644 Element setter = null;
641 // TODO(ngeoffray): If target is a field, check that there's a 645 Element getter = null;
642 // setter. 646 if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) {
647 AbstractFieldElement field = target;
648 setter = field.setter;
649 getter = field.getter;
650 } else {
651 setter = target;
652 getter = target;
653 }
643 // TODO(ngeoffray): Check if the target can be assigned. 654 // TODO(ngeoffray): Check if the target can be assigned.
644 Identifier op = node.assignmentOperator; 655 Identifier op = node.assignmentOperator;
645 bool needsGetter = op.source.stringValue !== '='; 656 bool needsGetter = op.source.stringValue !== '=';
646 Selector selector; 657 Selector selector;
647 if (needsGetter) { 658 if (needsGetter) {
648 // Resolve the getter for the lhs (receiver+selector).
649 // Currently this is the same as the setter.
650 // TODO(ngeoffray): Adapt for fields.
651 Element getter;
652 if (node.isIndex) { 659 if (node.isIndex) {
653 selector = Selector.INDEX_AND_INDEX_SET; 660 selector = Selector.INDEX_AND_INDEX_SET;
654 getter = target;
655 } else { 661 } else {
656 selector = Selector.GETTER_AND_SETTER; 662 selector = Selector.GETTER_AND_SETTER;
657 // TODO(ngeoffray): Find the getter from the setter.
658 getter = target;
659 } 663 }
660 useElement(node.selector, getter); 664 useElement(node.selector, getter);
661 } else if (node.isIndex) { 665 } else if (node.isIndex) {
662 selector = Selector.INDEX_SET; 666 selector = Selector.INDEX_SET;
663 } else { 667 } else {
664 selector = Selector.SETTER; 668 selector = Selector.SETTER;
665 } 669 }
670 visit(node.argumentsNode);
666 mapping.setSelector(node, selector); 671 mapping.setSelector(node, selector);
667 return useElement(node, target); 672 // TODO(ngeoffray): Warn if target is null and the send is
673 // unqualified.
674 return useElement(node, setter);
668 } 675 }
669 676
670 visitLiteralInt(LiteralInt node) { 677 visitLiteralInt(LiteralInt node) {
671 } 678 }
672 679
673 visitLiteralDouble(LiteralDouble node) { 680 visitLiteralDouble(LiteralDouble node) {
674 } 681 }
675 682
676 visitLiteralBool(LiteralBool node) { 683 visitLiteralBool(LiteralBool node) {
677 } 684 }
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 class TopScope extends Scope { 1132 class TopScope extends Scope {
1126 Universe universe; 1133 Universe universe;
1127 1134
1128 TopScope(Universe this.universe) : super(null, null); 1135 TopScope(Universe this.universe) : super(null, null);
1129 Element lookup(SourceString name) => universe.find(name); 1136 Element lookup(SourceString name) => universe.find(name);
1130 1137
1131 Element add(Element element) { 1138 Element add(Element element) {
1132 throw "Cannot add an element in the top scope"; 1139 throw "Cannot add an element in the top scope";
1133 } 1140 }
1134 } 1141 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698