Chromium Code Reviews| 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; |