Chromium Code Reviews| Index: dart/lib/compiler/implementation/resolution/members.dart |
| diff --git a/dart/lib/compiler/implementation/resolution/members.dart b/dart/lib/compiler/implementation/resolution/members.dart |
| index f96bf11e786cad256e730dae6ca0b7deb1a6d68f..34a1ea194f355832ec7941e7af332a1a377942a0 100644 |
| --- a/dart/lib/compiler/implementation/resolution/members.dart |
| +++ b/dart/lib/compiler/implementation/resolution/members.dart |
| @@ -1853,7 +1853,7 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| visitReturn(Return node) { |
| if (node.isRedirectingFactoryBody) { |
| - unimplemented(node, 'redirecting constructors'); |
| + return resolveRedirectingFactory(node); |
| } |
| visit(node.expression); |
| } |
| @@ -1929,6 +1929,10 @@ class ResolverVisitor extends CommonResolverVisitor<Element> { |
| return node.accept(new ConstructorResolver(compiler, this)); |
| } |
| + FunctionElement resolveRedirectingFactory(Return node) { |
| + return node.accept(new ConstructorResolver(compiler, this)); |
| + } |
| + |
| DartType resolveTypeRequired(TypeAnnotation node) { |
| bool old = typeRequired; |
| typeRequired = true; |
| @@ -2923,13 +2927,19 @@ class ConstructorResolver extends CommonResolverVisitor<Element> { |
| inConstContext = node.isConst(); |
| Node selector = node.send.selector; |
| Element e = visit(selector); |
| + e = finishConstructorReference(e, node.send.selector); |
| + resolver.mapping.setType(node, type); |
| + return e; |
| + } |
| + |
| + FunctionElement finishConstructorReference(Element e, Node node) { |
|
Johnni Winther
2012/11/05 13:49:33
Strange name. Document the method.
|
| if (!Elements.isUnresolved(e) && identical(e.kind, ElementKind.CLASS)) { |
| ClassElement cls = e; |
| cls.ensureResolved(compiler); |
| if (cls.isInterface() && (cls.defaultClass == null)) { |
| - error(selector, MessageKind.CANNOT_INSTANTIATE_INTERFACE, [cls.name]); |
| + error(node, MessageKind.CANNOT_INSTANTIATE_INTERFACE, [cls.name]); |
| } |
| - e = lookupConstructor(cls, selector, const SourceString('')); |
| + e = lookupConstructor(cls, node, const SourceString('')); |
| } |
| if (type == null) { |
| if (Elements.isUnresolved(e)) { |
| @@ -2938,7 +2948,6 @@ class ConstructorResolver extends CommonResolverVisitor<Element> { |
| type = e.getEnclosingClass().computeType(compiler).asRaw(); |
| } |
| } |
| - resolver.mapping.setType(node, type); |
| return e; |
| } |
| @@ -2996,4 +3005,14 @@ class ConstructorResolver extends CommonResolverVisitor<Element> { |
| } |
| return e; |
| } |
| + |
| + /// Assumed to be called by [resolveRedirectingFactory]. |
| + Element visitReturn(Return node) { |
| + Element e = visit(node.expression); |
| + e = finishConstructorReference(e, node.expression); |
| + resolver.mapping.setType(node, type); |
| + // TODO(ahe): Remove this debug warning when this is fully implemented. |
| + warning(node.expression, MessageKind.GENERIC, ['e = $e; type = $type']); |
| + return e; |
| + } |
| } |