Index: compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java |
diff --git a/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java b/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java |
index 3d08526b444d084d124cc4611857a8151a040da0..34e8e90afa2df98766a7d0966c5522625d4b564a 100644 |
--- a/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java |
+++ b/compiler/java/com/google/dart/compiler/resolver/MemberBuilder.java |
@@ -20,7 +20,6 @@ import com.google.dart.compiler.ast.DartNodeTraverser; |
import com.google.dart.compiler.ast.DartParameter; |
import com.google.dart.compiler.ast.DartParameterizedNode; |
import com.google.dart.compiler.ast.DartPropertyAccess; |
-import com.google.dart.compiler.ast.DartTypeParameter; |
import com.google.dart.compiler.ast.DartUnit; |
import com.google.dart.compiler.ast.Modifiers; |
import com.google.dart.compiler.type.Type; |
@@ -61,6 +60,7 @@ public class MemberBuilder { |
EnclosingElement currentHolder; |
private ResolutionContext context; |
private boolean isStatic; |
+ private boolean isFactory; |
MemberElementBuilder(CoreTypeProvider typeProvider) { |
super(typeProvider); |
@@ -77,6 +77,11 @@ public class MemberBuilder { |
boolean isStaticContext() { |
return isStatic; |
} |
+ |
+ @Override |
+ boolean isFactoryContext() { |
+ return isFactory; |
+ } |
@Override |
public Element visitClass(DartClass node) { |
@@ -90,6 +95,7 @@ public class MemberBuilder { |
@Override |
public Element visitFunctionTypeAlias(DartFunctionTypeAlias node) { |
isStatic = false; |
+ isFactory = false; |
assert !ElementKind.of(currentHolder).equals(ElementKind.CLASS) : "nested class?"; |
FunctionAliasElement element = node.getSymbol(); |
currentHolder = element; |
@@ -99,10 +105,10 @@ public class MemberBuilder { |
for (DartParameter parameter : node.getParameters()) { |
parameters.add((VariableElement) parameter.accept(this)); |
} |
- Type returnType = resolveType(node.getReturnTypeNode(), false, TypeErrorCode.NO_SUCH_TYPE); |
+ Type returnType = resolveType(node.getReturnTypeNode(), false, false, TypeErrorCode.NO_SUCH_TYPE); |
ClassElement functionElement = getTypeProvider().getFunctionType().getElement(); |
element.setFunctionType(Types.makeFunctionType(getContext(), functionElement, |
- parameters, returnType, null)); |
+ parameters, returnType)); |
currentHolder = libraryElement; |
context = topLevelContext; |
return null; |
@@ -110,7 +116,8 @@ public class MemberBuilder { |
@Override |
public Element visitMethodDefinition(final DartMethodDefinition method) { |
- isStatic = method.getModifiers().isStatic() || method.getModifiers().isFactory(); |
+ isFactory = method.getModifiers().isFactory(); |
+ isStatic = method.getModifiers().isStatic() || isFactory; |
MethodElement element = method.getSymbol(); |
if (element == null) { |
switch (getMethodKind(method)) { |
@@ -137,9 +144,7 @@ public class MemberBuilder { |
recordElement(method, element); |
ResolutionContext previous = context; |
context = context.extend(element.getName()); |
- List<DartTypeParameter> parameterNodes = method.getTypeParameters(); |
- resolveFunction(method.getFunction(), element, |
- Elements.makeTypeVariables(parameterNodes, element)); |
+ resolveFunction(method.getFunction(), element); |
context = previous; |
} |
return null; |
@@ -148,12 +153,13 @@ public class MemberBuilder { |
@Override |
public Element visitFieldDefinition(DartFieldDefinition node) { |
isStatic = false; |
+ isFactory = false; |
for (DartField fieldNode : node.getFields()) { |
if (fieldNode.getModifiers().isStatic()) { |
isStatic = true; |
} |
} |
- Type type = resolveType(node.getTypeNode(), isStatic, TypeErrorCode.NO_SUCH_TYPE); |
+ Type type = resolveType(node.getTypeNode(), isStatic, false, TypeErrorCode.NO_SUCH_TYPE); |
for (DartField fieldNode : node.getFields()) { |
if (fieldNode.getModifiers().isAbstractField()) { |
buildAbstractField(fieldNode); |
@@ -175,9 +181,8 @@ public class MemberBuilder { |
context = topLevelContext; |
} |
- private MethodElement buildConstructor(final DartMethodDefinition method) { |
- // Resolve the constructor's name and class name. |
- Element e = method.getName().accept(new DartNodeTraverser<Element>() { |
+ private Element resolveConstructorName(final DartMethodDefinition method) { |
+ return method.getName().accept(new DartNodeTraverser<Element>() { |
@Override public Element visitPropertyAccess(DartPropertyAccess node) { |
Element element = node.getQualifier().accept(this); |
if (ElementKind.of(element).equals(ElementKind.CLASS)) { |
@@ -194,6 +199,7 @@ public class MemberBuilder { |
node, |
null, |
true, |
+ false, |
ResolverErrorCode.NO_SUCH_TYPE_CONSTRUCTOR).getElement(); |
} |
@Override public Element visitParameterizedNode(DartParameterizedNode node) { |
@@ -209,6 +215,11 @@ public class MemberBuilder { |
throw new RuntimeException("Unexpected node " + node); |
} |
}); |
+ } |
+ |
+ private MethodElement buildConstructor(final DartMethodDefinition method) { |
+ // Resolve the constructor's name and class name. |
+ Element e = resolveConstructorName(method); |
switch (ElementKind.of(e)) { |
default: |
@@ -302,7 +313,7 @@ public class MemberBuilder { |
DartMethodDefinition accessorNode = fieldNode.getAccessor(); |
MethodElement accessorElement = Elements.methodFromMethodNode(accessorNode, currentHolder); |
recordElement(accessorNode, accessorElement); |
- resolveFunction(accessorNode.getFunction(), accessorElement, null); |
+ resolveFunction(accessorNode.getFunction(), accessorElement); |
String name = fieldNode.getName().getTargetName(); |
Element element = null; |
@@ -383,6 +394,9 @@ public class MemberBuilder { |
} |
DartExpression name = method.getName(); |
+ if (name instanceof DartParameterizedNode) { |
+ return ElementKind.CONSTRUCTOR; |
+ } |
if (name instanceof DartIdentifier) { |
if (((DartIdentifier) name).getTargetName().equals(currentHolder.getName())) { |
return ElementKind.CONSTRUCTOR; |
@@ -398,6 +412,13 @@ public class MemberBuilder { |
} |
resolutionError(method.getName(), |
ResolverErrorCode.CANNOT_DECLARE_NON_FACTORY_CONSTRUCTOR); |
+ } else if (property.getQualifier() instanceof DartParameterizedNode) { |
+ DartParameterizedNode paramNode = (DartParameterizedNode)property.getQualifier(); |
+ if (paramNode.getExpression() instanceof DartIdentifier) { |
+ return ElementKind.CONSTRUCTOR; |
+ } |
+ resolutionError(method.getName(), |
+ ResolverErrorCode.TOO_MANY_QUALIFIERS_FOR_METHOD); |
} else { |
// Multiple qualifiers (Foo.bar.baz) |
resolutionError(method.getName(), |