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

Unified Diff: frog/leg/resolver.dart

Issue 9166010: Implement super calls. (Closed) Base URL: https://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
« no previous file with comments | « no previous file | frog/leg/ssa/builder.dart » ('j') | frog/leg/ssa/builder.dart » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/leg/resolver.dart
diff --git a/frog/leg/resolver.dart b/frog/leg/resolver.dart
index 0719b23532b118b0a745d247f5e136ca5e7ec904..ab23b93c0303d8653958412a80d5a19e8e9c811e 100644
--- a/frog/leg/resolver.dart
+++ b/frog/leg/resolver.dart
@@ -172,6 +172,9 @@ class ResolverVisitor extends AbstractVisitor/*<Element>*/ {
if (node.isThis()) {
if (!inInstanceContext) error(node, MessageKind.NO_THIS_IN_STATIC);
return null;
+ } else if (node.isSuper()) {
+ if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC);
+ return null;
} else {
Element element = lookup(node, node.source);
if (element == null) {
@@ -326,12 +329,24 @@ class FullResolverVisitor extends ResolverVisitor {
return null;
}
- SourceString name = selector.source;
+ SourceString name = selector.asIdentifier().source;
// No need to assign an element for a logical operation.
if (isLogicalOperator(selector)) return null;
Element target = null;
- if (node.isOperator) {
+ if (node.receiver !== null
+ && node.receiver.asIdentifier() !== null
+ && node.receiver.asIdentifier().isSuper()) {
+ ClassElement thisElement = enclosingElement.enclosingElement;
ngeoffray 2012/01/10 16:52:50 I think I'd prefer having a classElement field in
karlklose 2012/01/11 12:45:17 Done, added field currentClass.
+ ClassElement superElement = thisElement.superClass;
+ if (superElement === null) {
ngeoffray 2012/01/10 16:52:50 Should we attach the objectElement to the superEle
karlklose 2012/01/11 12:45:17 Done.
+ superElement = compiler.universe.find(compiler.types.OBJECT);
+ }
+ target = superElement.lookupLocalMember(name);
+ if (target == null) {
+ error(node, MessageKind.METHOD_NOT_FOUND, [superElement.name, name]);
+ }
+ } else if (node.isOperator) {
return null;
} else if (node.receiver === null) {
target = lookup(node, name);
@@ -344,9 +359,9 @@ class FullResolverVisitor extends ResolverVisitor {
ClassElement receiverClass = receiver;
target = receiverClass.resolve(compiler).lookupLocalMember(name);
if (target == null) {
- error(node, MessageKind.METHOD_NOT_FOUND, [receiver, name]);
+ error(node, MessageKind.METHOD_NOT_FOUND, [receiver.name, name]);
} else if (target.isInstanceMember()) {
- error(node, MessageKind.MEMBER_NOT_STATIC, [receiver, name]);
+ error(node, MessageKind.MEMBER_NOT_STATIC, [receiver.name, name]);
}
}
return target;
« no previous file with comments | « no previous file | frog/leg/ssa/builder.dart » ('j') | frog/leg/ssa/builder.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698