Chromium Code Reviews| Index: lib/compiler/implementation/resolution/members.dart |
| diff --git a/lib/compiler/implementation/resolution/members.dart b/lib/compiler/implementation/resolution/members.dart |
| index 0213cf35287fc6a6ecdbefc95fd337a3b32eb7e7..c70b5313add94d65b18df1c94e83954dfced258a 100644 |
| --- a/lib/compiler/implementation/resolution/members.dart |
| +++ b/lib/compiler/implementation/resolution/members.dart |
| @@ -1481,6 +1481,13 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| } |
| Element resolveSend(Send node) { |
|
ahe
2012/10/23 11:54:26
Karl, this is getting too horrible. Let's take a l
|
| + void withAdditionalCategories(int categories, void f()) { |
| + var oldCategory = allowedCategory; |
| + allowedCategory |= categories; |
| + f(); |
| + allowedCategory = oldCategory; |
| + } |
| + |
| Selector selector = resolveSelector(node); |
| if (node.receiver == null) { |
| @@ -1498,14 +1505,33 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| } |
| return compiler.assertMethod; |
| } |
| - return node.selector.accept(this); |
| + |
| + Element result; |
| + withAdditionalCategories(ElementCategory.CLASS, () { |
| + result = node.selector.accept(this); |
| + }); |
| + if (result != null && result.kind == ElementKind.CLASS) { |
| + ClassElement classElement = result; |
| + classElement.ensureResolved(compiler); |
| + } |
| + return result; |
| } |
| - var oldCategory = allowedCategory; |
| - allowedCategory |= |
| - ElementCategory.CLASS | ElementCategory.PREFIX | ElementCategory.SUPER; |
| - Element resolvedReceiver = visit(node.receiver); |
| - allowedCategory = oldCategory; |
| + Element resolvedReceiver; |
| + withAdditionalCategories( |
| + ElementCategory.CLASS | ElementCategory.PREFIX | ElementCategory.SUPER, |
| + () { resolvedReceiver = visit(node.receiver); }); |
| + |
| + if (resolvedReceiver != null |
| + && resolvedReceiver.kind == ElementKind.CLASS) { |
| + ClassElement classElement = resolvedReceiver; |
| + classElement.ensureResolved(compiler); |
| + if (node.isOperator) { |
| + // In operator expressions like 'Class + 1', the operator call goes the |
| + // instance of [Type] that is the result of the expression 'Class'. |
| + resolvedReceiver = null; |
| + } |
| + } |
| Element target; |
| SourceString name = node.selector.asIdentifier().source; |
| @@ -1560,6 +1586,10 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| error(node, MessageKind.NO_SUCH_LIBRARY_MEMBER, [prefix.name, name]); |
| } |
| } |
| + if (target != null && target.kind == ElementKind.CLASS) { |
| + ClassElement classElement = target; |
| + classElement.ensureResolved(compiler); |
| + } |
| return target; |
| } |