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

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 620 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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 }
OLDNEW
« no previous file with comments | « frog/leg/namer.dart ('k') | frog/leg/scanner/parser.dart » ('j') | frog/leg/scanner/parser.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698