| 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;
|
|
|