Index: compiler/java/com/google/dart/compiler/resolver/Resolver.java |
diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java |
index 767202d929d236d3b2b85d7d60a8c037d2f3f9bf..e6c915476996f56a99363f333358667af25dfc85 100644 |
--- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java |
+++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java |
@@ -654,6 +654,7 @@ public class Resolver { |
&& !Elements.isNonFactoryConstructor(member) |
&& !member.getModifiers().isAbstract() |
&& !member.getModifiers().isExternal() |
+ && node.getRedirectedTypeName() == null |
&& !isInterface) { |
onError(functionNode, ResolverErrorCode.METHOD_MUST_HAVE_BODY); |
} |
@@ -664,6 +665,33 @@ public class Resolver { |
resolveInitializers(node, initializedFields); |
} |
+ // resolve redirecting factory constructor |
+ { |
+ DartTypeNode rcTypeName = node.getRedirectedTypeName(); |
+ if (rcTypeName != null) { |
+ InterfaceType rcType = (InterfaceType) resolveType(rcTypeName, true, true, |
+ TypeErrorCode.NO_SUCH_TYPE, ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
+ switch (TypeKind.of(rcType)) { |
+ case INTERFACE: |
+ Element element = recordType(rcTypeName, rcType); |
+ DartIdentifier rcName = node.getRedirectedConstructorName(); |
+ if (rcName != null) { |
+ element = ((ClassElement) element).lookupConstructor(rcName.getName()); |
+ switch (ElementKind.of(element)) { |
+ case CONSTRUCTOR: |
+ recordElement(rcName, element); |
+ if (member.getModifiers().isConstant() && !element.getModifiers().isConstant()) { |
+ onError(rcName, |
+ ResolverErrorCode.REDIRECTION_CONSTRUCTOR_TARGET_MUST_BE_CONST); |
+ } |
+ break; |
+ } |
+ } |
+ break; |
+ } |
+ } |
+ } |
+ |
context = previousContext; |
innermostFunction = currentMethod = null; |
enclosingElement = previousEnclosingElement; |