| Index: lib/compiler/implementation/resolver.dart
|
| diff --git a/lib/compiler/implementation/resolver.dart b/lib/compiler/implementation/resolver.dart
|
| index 771c5dc12db4721d708bbf8cec6c9cdc9d12e5e9..e6f318669266e92f4079050283c060538e33ecf9 100644
|
| --- a/lib/compiler/implementation/resolver.dart
|
| +++ b/lib/compiler/implementation/resolver.dart
|
| @@ -1357,23 +1357,13 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
|
| return null;
|
| }
|
|
|
| - TypeAnnotation getTypeAnnotationFromSend(Send send) {
|
| - if (send.selector.asTypeAnnotation() !== null) {
|
| - return send.selector;
|
| - } else if (send.selector.asSend() !== null) {
|
| - Send selector = send.selector;
|
| - if (selector.receiver.asTypeAnnotation() !== null) {
|
| - return selector.receiver;
|
| - }
|
| - } else {
|
| - compiler.internalError("malformed send in new expression");
|
| - }
|
| - }
|
| -
|
| FunctionElement resolveConstructor(NewExpression node) {
|
| FunctionElement constructor =
|
| node.accept(new ConstructorResolver(compiler, this));
|
| - TypeAnnotation annotation = getTypeAnnotationFromSend(node.send);
|
| + TypeAnnotation annotation = node.getTypeAnnotation();
|
| + if (annotation == null) {
|
| + compiler.internalError("malformed send in new expression");
|
| + }
|
| Type type = resolveTypeRequired(annotation);
|
| if (constructor === null) {
|
| Element resolved = (type != null) ? type.element : null;
|
| @@ -1384,6 +1374,8 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
|
| error(node.send, MessageKind.CANNOT_FIND_CONSTRUCTOR, [node.send]);
|
| return null;
|
| }
|
| + } else {
|
| + useType(annotation, type);
|
| }
|
| return constructor;
|
| }
|
| @@ -1729,13 +1721,20 @@ class ClassResolverVisitor extends CommonResolverVisitor<Type> {
|
| // TODO(johnniwinther): Handle function types.
|
| return type;
|
| }
|
| + int typeParameterCount = type.element.typeParameters.length;
|
| if (node.typeArguments === null) {
|
| - if (type.arguments.isEmpty()) {
|
| + if (type.typeArguments.isEmpty() || typeParameterCount == 0) {
|
| return type;
|
| }
|
| // Return the 'raw' version, for example List for List<E>.
|
| return new InterfaceType(type.element);
|
| }
|
| + int typeArgumentCount = node.typeArguments.length();
|
| + if (typeArgumentCount < typeParameterCount) {
|
| + error(node.typeArguments, MessageKind.MISSING_TYPE_ARGUMENT);
|
| + } else if (typeArgumentCount > typeParameterCount) {
|
| + error(node.typeArguments, MessageKind.ADDITIONAL_TYPE_ARGUMENT);
|
| + }
|
| var typeArguments = new LinkBuilder<Type>();
|
| var link = node.typeArguments.nodes;
|
| while (!link.isEmpty()) {
|
| @@ -1796,9 +1795,9 @@ class ClassResolverVisitor extends CommonResolverVisitor<Type> {
|
| return e.computeType(compiler);
|
| }
|
|
|
| - Link<Type> getOrCalculateAllSupertypes(ClassElement cls,
|
| - [Set<ClassElement> seen]) {
|
| - Link<Type> allSupertypes = cls.allSupertypes;
|
| + Link<InterfaceType> getOrCalculateAllSupertypes(ClassElement cls,
|
| + [Set<ClassElement> seen]) {
|
| + Link<InterfaceType> allSupertypes = cls.allSupertypes;
|
| if (allSupertypes !== null) return allSupertypes;
|
| if (seen === null) {
|
| seen = new Set<ClassElement>();
|
| @@ -1807,7 +1806,7 @@ class ClassResolverVisitor extends CommonResolverVisitor<Type> {
|
| error(cls.parseNode(compiler),
|
| MessageKind.CYCLIC_CLASS_HIERARCHY,
|
| [cls.name]);
|
| - cls.allSupertypes = const EmptyLink<Type>();
|
| + cls.allSupertypes = const EmptyLink<InterfaceType>();
|
| } else {
|
| cls.ensureResolved(compiler);
|
| calculateAllSupertypes(cls, seen);
|
| @@ -1824,32 +1823,27 @@ class ClassResolverVisitor extends CommonResolverVisitor<Type> {
|
| error(cls.parseNode(compiler),
|
| MessageKind.CYCLIC_CLASS_HIERARCHY,
|
| [cls.name]);
|
| - cls.allSupertypes = const EmptyLink<Type>();
|
| + cls.allSupertypes = const EmptyLink<InterfaceType>();
|
| } else if (supertype != null) {
|
| seen.add(cls);
|
| ClassElement supertypeElement = supertype.element;
|
| - Link<Type> superSupertypes =
|
| + Link<InterfaceType> superSupertypes =
|
| getOrCalculateAllSupertypes(supertypeElement, seen);
|
| - var superTypesBuilder = new LinkBuilder<Type>();
|
| + var superTypesBuilder = new LinkBuilder<InterfaceType>();
|
| superTypesBuilder.addLast(supertype);
|
|
|
| // Substitute type variables in supertypes.
|
| - var superTypeParameters = <Type>[];
|
| - var typeVariableElements = supertypeElement.typeParameters.getValues();
|
| - for (TypeVariableElement typeVariableElement in typeVariableElements) {
|
| - superTypeParameters.add(typeVariableElement.type);
|
| - }
|
| for (Type superSupertype in superSupertypes) {
|
| - superTypesBuilder.addLast(superSupertype.subst(
|
| - supertype.arguments, superTypeParameters));
|
| + superTypesBuilder.addLast(superSupertype.subst(compiler,
|
| + supertype.typeArguments, supertypeElement.typeParameters));
|
| }
|
|
|
| - Link<Type> supertypes = superTypesBuilder.toLink();
|
| - for (Link<Type> interfaces = cls.interfaces;
|
| + Link<InterfaceType> supertypes = superTypesBuilder.toLink();
|
| + for (Link<InterfaceType> interfaces = cls.interfaces;
|
| !interfaces.isEmpty();
|
| interfaces = interfaces.tail) {
|
| Element element = interfaces.head.element;
|
| - Link<Type> interfaceSupertypes =
|
| + Link<InterfaceType> interfaceSupertypes =
|
| getOrCalculateAllSupertypes(element, seen);
|
| supertypes = supertypes.reversePrependAll(interfaceSupertypes);
|
| supertypes = supertypes.prepend(interfaces.head);
|
| @@ -1857,7 +1851,7 @@ class ClassResolverVisitor extends CommonResolverVisitor<Type> {
|
| seen.remove(cls);
|
| cls.allSupertypes = supertypes;
|
| } else {
|
| - cls.allSupertypes = const EmptyLink<Type>();
|
| + cls.allSupertypes = const EmptyLink<InterfaceType>();
|
| }
|
| }
|
|
|
|
|