| 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 06347840027002354d033f0aac19cbd542505763..14faa444ef5c32a61fd18ff7ceed3892e8fba14c 100644
|
| --- a/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java
|
| +++ b/compiler/java/com/google/dart/compiler/resolver/ResolutionContext.java
|
| @@ -109,7 +109,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.
|
| */
|
| @@ -123,7 +123,7 @@ public class ResolutionContext implements ResolutionErrorListener {
|
| return null;
|
| }
|
|
|
| - Type type = resolveType(node, isStatic);
|
| + Type type = resolveType(node, isStatic, ResolverErrorCode.NO_SUCH_TYPE);
|
| if (!isClassType(type)) {
|
| onError(node.getIdentifier(), ResolverErrorCode.NOT_A_CLASS, type);
|
| type = typeProvider.getDynamicType();
|
| @@ -134,12 +134,8 @@ public class ResolutionContext implements ResolutionErrorListener {
|
| }
|
|
|
| InterfaceType resolveInterface(DartTypeNode node, boolean isStatic) {
|
| - if (node == null) {
|
| - return null;
|
| - }
|
| -
|
| - Type type = resolveType(node, isStatic);
|
| - if (!isClassOrInterfaceType(type)) {
|
| + Type type = resolveType(node, isStatic, ResolverErrorCode.NO_SUCH_TYPE);
|
| + if (type.getKind() != TypeKind.DYNAMIC && !isClassOrInterfaceType(type)) {
|
| onError(node.getIdentifier(), ResolverErrorCode.NOT_A_CLASS_OR_INTERFACE, type);
|
| type = typeProvider.getDynamicType();
|
| }
|
| @@ -148,18 +144,19 @@ public class ResolutionContext implements ResolutionErrorListener {
|
| return (InterfaceType) type;
|
| }
|
|
|
| - Type resolveType(DartTypeNode node, boolean isStatic) {
|
| + Type resolveType(DartTypeNode node, boolean isStatic, ErrorCode errorCode) {
|
| if (node == null) {
|
| return null;
|
| } else {
|
| - return resolveType(node, node.getIdentifier(), node.getTypeArguments(), isStatic);
|
| + return resolveType(node, node.getIdentifier(), node.getTypeArguments(), isStatic, errorCode);
|
| }
|
| }
|
|
|
| Type resolveType(DartNode diagnosticNode, DartNode identifier, List<DartTypeNode> typeArguments,
|
| - boolean isStatic) {
|
| + boolean isStatic, ErrorCode errorCode) {
|
| Element element = resolveName(identifier);
|
| - switch (ElementKind.of(element)) {
|
| + ElementKind elementKind = ElementKind.of(element);
|
| + switch (elementKind) {
|
| case TYPE_VARIABLE: {
|
| TypeVariableElement typeVariableElement = (TypeVariableElement) element;
|
| if (isStatic &&
|
| @@ -172,25 +169,31 @@ public class ResolutionContext implements ResolutionErrorListener {
|
| }
|
| case CLASS:
|
| case FUNCTION_TYPE_ALIAS:
|
| - return instantiateParameterizedType((ClassElement) element, diagnosticNode, typeArguments,
|
| - isStatic);
|
| + return instantiateParameterizedType(
|
| + (ClassElement) element,
|
| + diagnosticNode,
|
| + typeArguments,
|
| + isStatic,
|
| + errorCode);
|
| case NONE:
|
| if (identifier.toString().equals("void")) {
|
| return typeProvider.getVoidType();
|
| }
|
| + if (identifier.toString().equals("Dynamic")) {
|
| + return typeProvider.getDynamicType();
|
| + }
|
| break;
|
| + default:
|
| + onError(identifier, TypeErrorCode.NOT_A_TYPE, identifier, elementKind);
|
| }
|
| - if (shouldWarnOnNoSuchType()) {
|
| - onError(identifier, TypeErrorCode.NO_SUCH_TYPE, identifier);
|
| - } else {
|
| - onError(identifier, ResolverErrorCode.NO_SUCH_TYPE, identifier);
|
| - }
|
| + onError(identifier, errorCode, identifier);
|
| return typeProvider.getDynamicType();
|
| }
|
|
|
| InterfaceType instantiateParameterizedType(ClassElement element, DartNode node,
|
| List<DartTypeNode> typeArgumentNodes,
|
| - boolean isStatic) {
|
| + boolean isStatic,
|
| + ErrorCode errorCode) {
|
| List<? extends Type> typeParameters = element.getTypeParameters();
|
| Type[] typeArguments;
|
| if (typeArgumentNodes == null || typeArgumentNodes.size() != typeParameters.size()) {
|
| @@ -199,12 +202,16 @@ public class ResolutionContext implements ResolutionErrorListener {
|
| typeArguments[i] = typeProvider.getDynamicType();
|
| }
|
| if (typeArgumentNodes != null && typeArgumentNodes.size() > 0) {
|
| - onError(node, ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, element.getType());
|
| + ErrorCode wrongNumberErrorCode =
|
| + errorCode instanceof ResolverErrorCode
|
| + ? ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS
|
| + : TypeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
|
| + onError(node, wrongNumberErrorCode, element.getType());
|
| }
|
| int index = 0;
|
| if (typeArgumentNodes != null) {
|
| for (DartTypeNode typeNode : typeArgumentNodes) {
|
| - Type type = resolveType(typeNode, isStatic);
|
| + Type type = resolveType(typeNode, isStatic, errorCode);
|
| typeNode.setType(type);
|
| if (index < typeArguments.length) {
|
| typeArguments[index] = type;
|
| @@ -215,7 +222,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);
|
| + typeArguments[i] = resolveType(typeArgumentNodes.get(i), isStatic, errorCode);
|
| typeArgumentNodes.get(i).setType(typeArguments[i]);
|
| }
|
| }
|
|
|