Index: compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java |
diff --git a/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java b/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java |
index df9aa182272c2faccabf58ea8f33a8edae91a94c..728dac1a931f1a8b875d17b4bf6c431c5280307f 100644 |
--- a/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java |
+++ b/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java |
@@ -110,7 +110,7 @@ public class ResolutionContext implements ResolutionErrorListener { |
private boolean isClassType(Type type) { |
return isInterfaceEquals(type, false); |
} |
- |
+ |
/** |
* Returns <code>true</code> if the type is a class or interface type. |
*/ |
@@ -119,12 +119,15 @@ public class ResolutionContext implements ResolutionErrorListener { |
&& ((InterfaceType) type).getElement() != null; |
} |
- InterfaceType resolveClass(DartTypeNode node, boolean isStatic) { |
+ /** |
+ * To resolve the class<typeparameters?> specified for extends on a class definition. |
+ */ |
+ InterfaceType resolveClass(DartTypeNode node, boolean isStatic, boolean isFactory) { |
if (node == null) { |
return null; |
} |
- Type type = resolveType(node, isStatic, ResolverErrorCode.NO_SUCH_TYPE); |
+ Type type = resolveType(node, isStatic, isFactory, ResolverErrorCode.NO_SUCH_TYPE); |
if (!isClassType(type)) { |
onError(node.getIdentifier(), ResolverErrorCode.NOT_A_CLASS, type); |
type = typeProvider.getDynamicType(); |
@@ -134,8 +137,8 @@ public class ResolutionContext implements ResolutionErrorListener { |
return (InterfaceType) type; |
} |
- InterfaceType resolveInterface(DartTypeNode node, boolean isStatic) { |
- Type type = resolveType(node, isStatic, ResolverErrorCode.NO_SUCH_TYPE); |
+ InterfaceType resolveInterface(DartTypeNode node, boolean isStatic, boolean isFactory) { |
+ Type type = resolveType(node, isStatic, isFactory, ResolverErrorCode.NO_SUCH_TYPE); |
if (type.getKind() != TypeKind.DYNAMIC && !isClassOrInterfaceType(type)) { |
onError(node.getIdentifier(), ResolverErrorCode.NOT_A_CLASS_OR_INTERFACE, type); |
type = typeProvider.getDynamicType(); |
@@ -145,22 +148,23 @@ public class ResolutionContext implements ResolutionErrorListener { |
return (InterfaceType) type; |
} |
- Type resolveType(DartTypeNode node, boolean isStatic, ErrorCode errorCode) { |
+ Type resolveType(DartTypeNode node, boolean isStatic, boolean isFactory, ErrorCode errorCode) { |
if (node == null) { |
return null; |
} else { |
- return resolveType(node, node.getIdentifier(), node.getTypeArguments(), isStatic, errorCode); |
+ return resolveType(node, node.getIdentifier(), node.getTypeArguments(), isStatic, isFactory, |
+ errorCode); |
} |
} |
Type resolveType(DartNode diagnosticNode, DartNode identifier, List<DartTypeNode> typeArguments, |
- boolean isStatic, ErrorCode errorCode) { |
+ boolean isStatic, boolean isFactory, ErrorCode errorCode) { |
Element element = resolveName(identifier); |
ElementKind elementKind = ElementKind.of(element); |
switch (elementKind) { |
case TYPE_VARIABLE: { |
TypeVariableElement typeVariableElement = (TypeVariableElement) element; |
- if (isStatic && |
+ if (!isFactory && isStatic && |
typeVariableElement.getDeclaringElement().getKind().equals(ElementKind.CLASS)) { |
onError(identifier, ResolverErrorCode.TYPE_VARIABLE_IN_STATIC_CONTEXT, |
identifier); |
@@ -175,6 +179,7 @@ public class ResolutionContext implements ResolutionErrorListener { |
diagnosticNode, |
typeArguments, |
isStatic, |
+ isFactory, |
errorCode); |
case NONE: |
if (identifier.toString().equals("void")) { |
@@ -194,6 +199,7 @@ public class ResolutionContext implements ResolutionErrorListener { |
InterfaceType instantiateParameterizedType(ClassElement element, DartNode node, |
List<DartTypeNode> typeArgumentNodes, |
boolean isStatic, |
+ boolean isFactory, |
ErrorCode errorCode) { |
List<? extends Type> typeParameters = element.getTypeParameters(); |
Type[] typeArguments; |
@@ -212,7 +218,7 @@ public class ResolutionContext implements ResolutionErrorListener { |
int index = 0; |
if (typeArgumentNodes != null) { |
for (DartTypeNode typeNode : typeArgumentNodes) { |
- Type type = resolveType(typeNode, isStatic, errorCode); |
+ Type type = resolveType(typeNode, isStatic, isFactory, errorCode); |
typeNode.setType(type); |
if (index < typeArguments.length) { |
typeArguments[index] = type; |
@@ -223,7 +229,7 @@ public class ResolutionContext implements ResolutionErrorListener { |
} else { |
typeArguments = new Type[typeArgumentNodes.size()]; |
for (int i = 0; i < typeArguments.length; i++) { |
- typeArguments[i] = resolveType(typeArgumentNodes.get(i), isStatic, errorCode); |
+ typeArguments[i] = resolveType(typeArgumentNodes.get(i), isStatic, isFactory, errorCode); |
typeArgumentNodes.get(i).setType(typeArguments[i]); |
} |
} |
@@ -238,6 +244,9 @@ public class ResolutionContext implements ResolutionErrorListener { |
return element.getTypeVariable(); |
} |
+ /* |
+ * Interpret this node as a name reference, |
+ */ |
Element resolveName(DartNode node) { |
return node.accept(new Selector()); |
} |