| Index: frog/type.dart
|
| diff --git a/frog/type.dart b/frog/type.dart
|
| index ca8a1a2ff8d9c85bd2bfb80979cc5ed14b4b13dd..4d8b1377c43ceb393c590fa1665ad95680af0a43 100644
|
| --- a/frog/type.dart
|
| +++ b/frog/type.dart
|
| @@ -41,9 +41,7 @@ class Type implements Named, Hashable {
|
| Member getMember(String name) => null;
|
| abstract MethodMember getConstructor(String name);
|
| abstract MethodMember getFactory(Type type, String name);
|
| - abstract Type getOrMakeConcreteType(List<Type> typeArgs);
|
| - abstract Map<String, MethodMember> get constructors();
|
| - abstract addDirectSubtype(Type type);
|
| +
|
| abstract bool get isClass();
|
| abstract Library get library();
|
|
|
| @@ -85,14 +83,10 @@ class Type implements Named, Hashable {
|
|
|
| set jsname(String name) => _jsname = name;
|
|
|
| - Map<String, Member> get members() => null;
|
| - Definition get definition() => null;
|
| - FactoryMap get factories() => null;
|
| -
|
| // TODO(jmesserly): should try using a const list instead of null to represent
|
| // the absence of type parameters.
|
| Collection<Type> get typeArgsInOrder() => null;
|
| - DefinedType get genericType() => this;
|
| + Type get genericType() => this;
|
|
|
| // TODO(jmesserly): what should these do for ParameterType?
|
| List<Type> get interfaces() => null;
|
| @@ -310,9 +304,6 @@ class ParameterType extends Type {
|
|
|
| ParameterType(String name, this.typeParameter): super(name);
|
|
|
| - Map<String, MethodMember> get constructors() =>
|
| - world.internalError('no constructors on type parameters yet');
|
| -
|
| MethodMember getCallMethod() => extendsType.getCallMethod();
|
|
|
| void genMethod(Member method) {
|
| @@ -331,18 +322,10 @@ class ParameterType extends Type {
|
| world.internalError('no constructors on type parameters yet');
|
| }
|
|
|
| - Type getOrMakeConcreteType(List<Type> typeArgs) {
|
| - world.internalError('no concrete types of type parameters yet', span);
|
| - }
|
| -
|
| Type resolveTypeParams(ConcreteType inType) {
|
| return inType.typeArguments[name];
|
| }
|
|
|
| - addDirectSubtype(Type type) {
|
| - world.internalError('no subtypes of type parameters yet', span);
|
| - }
|
| -
|
| resolve(Type inType) {
|
| if (typeParameter.extendsType != null) {
|
| extendsType = inType.resolveType(typeParameter.extendsType, true);
|
| @@ -355,7 +338,7 @@ class ParameterType extends Type {
|
|
|
| /** A concrete version of a generic type. */
|
| class ConcreteType extends Type {
|
| - final DefinedType genericType;
|
| + final Type genericType;
|
| Map<String, Type> typeArguments;
|
| List<Type> _interfaces;
|
| List<Type> typeArgsInOrder;
|
| @@ -741,14 +724,13 @@ class DefinedType extends Type {
|
|
|
| resolve() {
|
| if (definition is TypeDefinition) {
|
| - TypeDefinition typeDef = definition;
|
| if (isClass) {
|
| - if (typeDef.extendsTypes != null && typeDef.extendsTypes.length > 0) {
|
| - if (typeDef.extendsTypes.length > 1) {
|
| + if (definition.extendsTypes != null && definition.extendsTypes.length > 0) {
|
| + if (definition.extendsTypes.length > 1) {
|
| world.error('more than one base class',
|
| - typeDef.extendsTypes[1].span);
|
| + definition.extendsTypes[1].span);
|
| }
|
| - var extendsTypeRef = typeDef.extendsTypes[0];
|
| + var extendsTypeRef = definition.extendsTypes[0];
|
| if (extendsTypeRef is GenericTypeReference) {
|
| // If we are extending a generic type first resolve against the
|
| // base type, then the full generic type. This makes circular
|
| @@ -759,7 +741,7 @@ class DefinedType extends Type {
|
| parent = resolveType(extendsTypeRef, true);
|
| if (!parent.isClass) {
|
| world.error('class may not extend an interface - use implements',
|
| - typeDef.extendsTypes[0].span);
|
| + definition.extendsTypes[0].span);
|
| }
|
| parent.addDirectSubtype(this);
|
| if (_cycleInClassExtends()) {
|
| @@ -772,29 +754,31 @@ class DefinedType extends Type {
|
| parent = world.objectType;
|
| }
|
| }
|
| - this.interfaces = _resolveInterfaces(typeDef.implementsTypes);
|
| - if (typeDef.factoryType != null) {
|
| + this.interfaces = _resolveInterfaces(definition.implementsTypes);
|
| + if (definition.factoryType != null) {
|
| world.error('factory not allowed on classes',
|
| - typeDef.factoryType.span);
|
| + definition.factoryType.span);
|
| }
|
| } else {
|
| - if (typeDef.implementsTypes != null &&
|
| - typeDef.implementsTypes.length > 0) {
|
| + if (definition.implementsTypes != null &&
|
| + definition.implementsTypes.length > 0) {
|
| world.error('implements not allowed on interfaces (use extends)',
|
| - typeDef.implementsTypes[0].span);
|
| + definition.implementsTypes[0].span);
|
| }
|
| - this.interfaces = _resolveInterfaces(typeDef.extendsTypes);
|
| + this.interfaces = _resolveInterfaces(definition.extendsTypes);
|
| final res = _cycleInInterfaceExtends();
|
| if (res >= 0) {
|
| world.error('interface "$name" has a cycle in its inheritance chain',
|
| - typeDef.extendsTypes[res].span);
|
| + definition.extendsTypes[res].span);
|
| }
|
|
|
| - if (typeDef.factoryType != null) {
|
| - factory_ = resolveType(typeDef.factoryType, true);
|
| + if (definition.factoryType != null) {
|
| + factory_ = resolveType(definition.factoryType, true);
|
| if (factory_ == null) {
|
| // TODO(jimhug): Appropriate warning levels;
|
| - world.warning('unresolved factory', typeDef.factoryType.span);
|
| + world.info(
|
| + 'unresolved factory: ${definition.factoryType.name.name}',
|
| + definition.factoryType.name.span);
|
| }
|
| }
|
| }
|
| @@ -951,9 +935,7 @@ class DefinedType extends Type {
|
| inits = [new CallExpression(new SuperExpression(span), [], span)];
|
| }
|
|
|
| -
|
| - TypeDefinition typeDef = definition;
|
| - var c = new FunctionDefinition(null, null, typeDef.name, [],
|
| + var c = new FunctionDefinition(null, null, definition.name, [],
|
| inits, body, span);
|
| addMethod(null, c);
|
| constructors[''].resolve(this);
|
| @@ -1088,62 +1070,59 @@ class DefinedType extends Type {
|
| // same message twice.
|
|
|
| if (node is NameTypeReference) {
|
| - NameTypeReference typeRef = node;
|
| String name;
|
| - if (typeRef.names != null) {
|
| - name = typeRef.names.last().name;
|
| + if (node.names != null) {
|
| + name = node.names.last().name;
|
| } else {
|
| - name = typeRef.name.name;
|
| + name = node.name.name;
|
| }
|
| if (typeParameters != null) {
|
| for (var tp in typeParameters) {
|
| if (tp.name == name) {
|
| - typeRef.type = tp;
|
| + node.type = tp;
|
| }
|
| }
|
| }
|
| - if (typeRef.type == null) {
|
| - typeRef.type = library.findType(typeRef);
|
| + if (node.type == null) {
|
| + node.type = library.findType(node);
|
| }
|
| - if (typeRef.type == null) {
|
| - var message = 'can not find type ${_getDottedName(typeRef)}';
|
| + if (node.type == null) {
|
| + var message = 'can not find type ${_getDottedName(node)}';
|
| if (typeErrors) {
|
| - world.error(message, typeRef.span);
|
| - typeRef.type = world.objectType;
|
| + world.error(message, node.span);
|
| + node.type = world.objectType;
|
| } else {
|
| - world.warning(message, typeRef.span);
|
| - typeRef.type = world.varType;
|
| + world.warning(message, node.span);
|
| + node.type = world.varType;
|
| }
|
| }
|
| } else if (node is GenericTypeReference) {
|
| - GenericTypeReference typeRef = node;
|
| // TODO(jimhug): Expand the handling of typeErrors to generics and funcs
|
| - var baseType = resolveType(typeRef.baseType, typeErrors);
|
| + var baseType = resolveType(node.baseType, typeErrors);
|
| if (!baseType.isGeneric) {
|
| - world.error('${baseType.name} is not generic', typeRef.span);
|
| + world.error('${baseType.name} is not generic', node.span);
|
| return null;
|
| }
|
| - if (typeRef.typeArguments.length != baseType.typeParameters.length) {
|
| - world.error('wrong number of type arguments', typeRef.span);
|
| + if (node.typeArguments.length != baseType.typeParameters.length) {
|
| + world.error('wrong number of type arguments', node.span);
|
| return null;
|
| }
|
| var typeArgs = [];
|
| - for (int i=0; i < typeRef.typeArguments.length; i++) {
|
| + for (int i=0; i < node.typeArguments.length; i++) {
|
| var extendsType = baseType.typeParameters[i].extendsType;
|
| - var typeArg = resolveType(typeRef.typeArguments[i], typeErrors);
|
| + var typeArg = resolveType(node.typeArguments[i], typeErrors);
|
| typeArgs.add(typeArg);
|
|
|
| if (extendsType != null && typeArg is! ParameterType) {
|
| typeArg.ensureSubtypeOf(extendsType,
|
| - typeRef.typeArguments[i].span, typeErrors);
|
| + node.typeArguments[i].span, typeErrors);
|
| }
|
| }
|
| - typeRef.type = baseType.getOrMakeConcreteType(typeArgs);
|
| + node.type = baseType.getOrMakeConcreteType(typeArgs);
|
| } else if (node is FunctionTypeReference) {
|
| - FunctionTypeReference typeRef = node;
|
| var name = '';
|
| - if (typeRef.func.name != null) name = typeRef.func.name.name;
|
| - typeRef.type = library.getOrAddFunctionType(name, typeRef.func, this);
|
| + if (node.func.name != null) name = node.func.name.name;
|
| + node.type = library.getOrAddFunctionType(name, node.func, this);
|
| } else {
|
| world.internalError('unknown type reference', node.span);
|
| }
|
|
|