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

Unified 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, 11 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 side-by-side diff with in-line comments
Download patch
Index: frog/leg/resolver.dart
===================================================================
--- frog/leg/resolver.dart (revision 3791)
+++ frog/leg/resolver.dart (working copy)
@@ -638,35 +638,39 @@
mapping.setSelector(node, Selector.INDEX);
} else if (node.isPropertyAccess) {
mapping.setSelector(node, Selector.GETTER);
+ if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) {
+ AbstractFieldElement field = target;
+ target = field.getter;
+ }
} else {
handleArguments(node);
}
- // TODO(ngeoffray): If target is a field, check that there's a
- // getter.
+ // TODO(ngeoffray): Warn if target is null and the send is
+ // unqualified.
return useElement(node, target);
}
visitSendSet(SendSet node) {
Element target = resolveSend(node);
- visit(node.argumentsNode);
- // TODO(ngeoffray): If target is a field, check that there's a
- // setter.
+ Element setter = null;
+ Element getter = null;
+ if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) {
+ AbstractFieldElement field = target;
+ setter = field.setter;
+ getter = field.getter;
+ } else {
+ setter = target;
+ getter = target;
+ }
// TODO(ngeoffray): Check if the target can be assigned.
Identifier op = node.assignmentOperator;
bool needsGetter = op.source.stringValue !== '=';
Selector selector;
if (needsGetter) {
- // Resolve the getter for the lhs (receiver+selector).
- // Currently this is the same as the setter.
- // TODO(ngeoffray): Adapt for fields.
- Element getter;
if (node.isIndex) {
selector = Selector.INDEX_AND_INDEX_SET;
- getter = target;
} else {
selector = Selector.GETTER_AND_SETTER;
- // TODO(ngeoffray): Find the getter from the setter.
- getter = target;
}
useElement(node.selector, getter);
} else if (node.isIndex) {
@@ -674,8 +678,11 @@
} else {
selector = Selector.SETTER;
}
+ visit(node.argumentsNode);
mapping.setSelector(node, selector);
- return useElement(node, target);
+ // TODO(ngeoffray): Warn if target is null and the send is
+ // unqualified.
+ return useElement(node, setter);
}
visitLiteralInt(LiteralInt node) {
« 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