Index: pkg/compiler/lib/src/resolution/type_resolver.dart |
diff --git a/pkg/compiler/lib/src/resolution/type_resolver.dart b/pkg/compiler/lib/src/resolution/type_resolver.dart |
index 34e5cab4dc2d1a45624868171b19b9f6f5bf6edb..318e7488f429e86e8c8693d209a82407658f3935 100644 |
--- a/pkg/compiler/lib/src/resolution/type_resolver.dart |
+++ b/pkg/compiler/lib/src/resolution/type_resolver.dart |
@@ -27,16 +27,6 @@ import 'registry.dart' show ResolutionRegistry; |
import 'resolution_common.dart' show MappingVisitor; |
import 'scope.dart' show Scope; |
-class _FormalsTypeResolutionResult { |
- final List<ResolutionDartType> requiredTypes; |
- final List<ResolutionDartType> orderedTypes; |
- final List<String> names; |
- final List<ResolutionDartType> nameTypes; |
- |
- _FormalsTypeResolutionResult( |
- this.requiredTypes, this.orderedTypes, this.names, this.nameTypes); |
-} |
- |
class TypeResolver { |
final Resolution resolution; |
@@ -76,154 +66,6 @@ class TypeResolver { |
ResolutionDartType resolveTypeAnnotation( |
MappingVisitor visitor, TypeAnnotation node, |
{bool malformedIsError: false, bool deferredIsMalformed: true}) { |
- return _resolveTypeAnnotation( |
- visitor, node, const [], malformedIsError: malformedIsError, |
- deferredIsMalformed: deferredIsMalformed); |
- } |
- |
- // TODO(floitsch): the [visibleTypeParameterNames] is a hack to put |
- // type parameters in scope for the nested types. |
- // |
- // For example, in the following example, the generic type "A" would be stored |
- // in `visibleTypeParameterNames`. |
- // `typedef F = Function(List<A> Function<A>(A x))`. |
- // |
- // They are resolved to `dynamic` until dart2js supports generic methods. |
- ResolutionDartType _resolveTypeAnnotation( |
- MappingVisitor visitor, TypeAnnotation node, |
- List<List<String>> visibleTypeParameterNames, |
- {bool malformedIsError: false, bool deferredIsMalformed: true}) { |
- |
- if (node.asNominalTypeAnnotation() != null) { |
- return resolveNominalTypeAnnotation( |
- visitor, node, |
- visibleTypeParameterNames, |
- malformedIsError: malformedIsError, |
- deferredIsMalformed: deferredIsMalformed); |
- } |
- assert(node.asFunctionTypeAnnotation() != null); |
- return _resolveFunctionTypeAnnotation( |
- visitor, node, visibleTypeParameterNames, |
- malformedIsError: malformedIsError, |
- deferredIsMalformed: deferredIsMalformed); |
- } |
- |
- /// Resolves the types of a parameter list. |
- /// |
- /// This function does not accept "inline" function types. For example |
- /// `foo(int bar(String x))` is not accepted. |
- /// |
- /// However, it does work with nested generalized function types: |
- /// `foo(int Function(String) x)`. |
- _FormalsTypeResolutionResult _resolveFormalTypes( |
- MappingVisitor visitor, NodeList formals, |
- List<List<String>> visibleTypeParameterNames) { |
- |
- ResolutionDartType resolvePositionalType(VariableDefinitions node) { |
- return _resolveTypeAnnotation( |
- visitor, node.type, visibleTypeParameterNames); |
- } |
- |
- void fillNamedTypes(NodeList namedFormals, |
- List<String> names, List<ResolutionDartType> types) { |
- List<Node> nodes = namedFormals.nodes.toList(growable: false); |
- |
- // Sort the named arguments first. |
- nodes.sort((node1, node2) { |
- VariableDefinitions a = node1; |
- VariableDefinitions b = node2; |
- assert(a.definitions.nodes.tail.isEmpty); |
- assert(b.definitions.nodes.tail.isEmpty); |
- return a.definitions.nodes.head.asIdentifier().source.compareTo( |
- b.definitions.nodes.head.asIdentifier().source); |
- }); |
- |
- for (VariableDefinitions node in nodes) { |
- String name = node.definitions.nodes.head.asIdentifier().source; |
- ResolutionDartType type = node.type == null |
- ? const ResolutionDynamicType() |
- : _resolveTypeAnnotation( |
- visitor, node.type, visibleTypeParameterNames); |
- names.add(name); |
- types.add(type); |
- } |
- } |
- |
- List<ResolutionDartType> requiredTypes = <ResolutionDartType>[]; |
- NodeList optionalFormals = null; |
- for (Link<Node> link = formals.nodes; !link.isEmpty; link = link.tail) { |
- if (link.tail.isEmpty && link.head is NodeList) { |
- optionalFormals = link.head; |
- break; |
- } |
- requiredTypes.add(resolvePositionalType(link.head)); |
- } |
- |
- |
- List<ResolutionDartType> orderedTypes = const <ResolutionDartType>[]; |
- List<String> names = const <String>[]; |
- List<ResolutionDartType> namedTypes = const <ResolutionDartType>[]; |
- |
- if (optionalFormals != null) { |
- // This must be a list of optional arguments. |
- String value = optionalFormals.beginToken.stringValue; |
- if ((!identical(value, '[')) && (!identical(value, '{'))) { |
- reporter.internalError(optionalFormals, "expected optional parameters"); |
- } |
- bool optionalParametersAreNamed = (identical(value, '{')); |
- |
- if (optionalParametersAreNamed) { |
- names = <String>[]; |
- namedTypes = <ResolutionDartType>[]; |
- fillNamedTypes(optionalFormals, names, namedTypes); |
- } else { |
- orderedTypes = <ResolutionDartType>[]; |
- for (Link<Node> link = optionalFormals.nodes; |
- !link.isEmpty; |
- link = link.tail) { |
- orderedTypes.add(resolvePositionalType(link.head)); |
- } |
- } |
- } |
- return new _FormalsTypeResolutionResult( |
- requiredTypes, orderedTypes, names, namedTypes); |
- } |
- |
- ResolutionFunctionType _resolveFunctionTypeAnnotation(MappingVisitor visitor, |
- FunctionTypeAnnotation node, |
- List<List<String>> visibleTypeParameterNames, |
- {bool malformedIsError: false, bool deferredIsMalformed: true}) { |
- |
- assert(visibleTypeParameterNames != null); |
- |
- if (node.typeParameters != null) { |
- List<String> newTypeNames = node.typeParameters.map((TypeVariable node) { |
- return node.name.asIdentifier().source; |
- }).toList(); |
- visibleTypeParameterNames = |
- visibleTypeParameterNames.toList()..add(newTypeNames); |
- } |
- |
- ResolutionDartType returnType = node.returnType == null |
- ? const ResolutionDynamicType() |
- : _resolveTypeAnnotation(visitor, node.returnType, |
- visibleTypeParameterNames); |
- var formalTypes = |
- _resolveFormalTypes(visitor, node.formals, visibleTypeParameterNames); |
- var result = new ResolutionFunctionType.generalized( |
- returnType, |
- formalTypes.requiredTypes, |
- formalTypes.orderedTypes, |
- formalTypes.names, |
- formalTypes.nameTypes); |
- visitor.registry.useType(node, result); |
- return result; |
- } |
- |
- ResolutionDartType resolveNominalTypeAnnotation(MappingVisitor visitor, |
- NominalTypeAnnotation node, |
- List<List<String>> visibleTypeParameterNames, |
- {bool malformedIsError: false, bool deferredIsMalformed: true}) { |
ResolutionRegistry registry = visitor.registry; |
Identifier typeName; |
@@ -232,8 +74,7 @@ class TypeResolver { |
ResolutionDartType checkNoTypeArguments(ResolutionDartType type) { |
List<ResolutionDartType> arguments = new List<ResolutionDartType>(); |
bool hasTypeArgumentMismatch = resolveTypeArguments( |
- visitor, node, const <ResolutionDartType>[], arguments, |
- visibleTypeParameterNames); |
+ visitor, node, const <ResolutionDartType>[], arguments); |
if (hasTypeArgumentMismatch) { |
return new MalformedType( |
new ErroneousElementX(MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH, |
@@ -265,6 +106,9 @@ class TypeResolver { |
} |
} |
+ Element element = resolveTypeName(prefixName, typeName, visitor.scope, |
+ deferredIsMalformed: deferredIsMalformed); |
+ |
ResolutionDartType reportFailureAndCreateType( |
MessageKind messageKind, Map messageArguments, |
{ResolutionDartType userProvidedBadType, |
@@ -284,33 +128,14 @@ class TypeResolver { |
typeName.source, visitor.enclosingElement); |
} |
List<ResolutionDartType> arguments = <ResolutionDartType>[]; |
- resolveTypeArguments(visitor, node, const <ResolutionDartType>[], |
- arguments, visibleTypeParameterNames); |
+ resolveTypeArguments( |
+ visitor, node, const <ResolutionDartType>[], arguments); |
return new MalformedType( |
erroneousElement, userProvidedBadType, arguments); |
} |
- Element element; |
- // Resolve references to type names as dynamic. |
- // TODO(floitsch): this hackishly resolves generic function type arguments |
- // to dynamic. |
- if (prefixName == null && |
- visibleTypeParameterNames.any((n) => n.contains(typeName.source))) { |
- type = const ResolutionDynamicType(); |
- } else { |
- element = resolveTypeName(prefixName, typeName, visitor.scope, |
- deferredIsMalformed: deferredIsMalformed); |
- } |
- |
// Try to construct the type from the element. |
- if (type != null) { |
- // Already assigned to through the visibleTypeParameterNames. |
- // Just make sure that it doesn't have type arguments. |
- if (node.typeArguments != null) { |
- reporter.reportWarningMessage(node.typeArguments.nodes.head, |
- MessageKind.ADDITIONAL_TYPE_ARGUMENT); |
- } |
- } else if (element == null) { |
+ if (element == null) { |
type = reportFailureAndCreateType( |
MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': node.typeName}); |
} else if (element.isAmbiguous) { |
@@ -345,9 +170,8 @@ class TypeResolver { |
resolver.ensureClassWillBeResolvedInternal(cls); |
cls.computeType(resolution); |
List<ResolutionDartType> arguments = <ResolutionDartType>[]; |
- bool hasTypeArgumentMismatch = resolveTypeArguments( |
- visitor, node, cls.typeVariables, arguments, |
- visibleTypeParameterNames); |
+ bool hasTypeArgumentMismatch = |
+ resolveTypeArguments(visitor, node, cls.typeVariables, arguments); |
if (hasTypeArgumentMismatch) { |
type = new BadInterfaceType( |
cls.declaration, |
@@ -370,8 +194,7 @@ class TypeResolver { |
typdef.computeType(resolution); |
List<ResolutionDartType> arguments = <ResolutionDartType>[]; |
bool hasTypeArgumentMismatch = resolveTypeArguments( |
- visitor, node, typdef.typeVariables, arguments, |
- visibleTypeParameterNames); |
+ visitor, node, typdef.typeVariables, arguments); |
if (hasTypeArgumentMismatch) { |
type = new BadTypedefType( |
typdef, |
@@ -418,7 +241,7 @@ class TypeResolver { |
} |
/// Checks the type arguments of [type] against the type variable bounds. |
- void checkTypeVariableBounds(NominalTypeAnnotation node, GenericType type) { |
+ void checkTypeVariableBounds(TypeAnnotation node, GenericType type) { |
void checkTypeVariableBound(_, ResolutionDartType typeArgument, |
ResolutionTypeVariableType typeVariable, ResolutionDartType bound) { |
if (!types.isSubtype(typeArgument, bound)) { |
@@ -443,10 +266,9 @@ class TypeResolver { |
*/ |
bool resolveTypeArguments( |
MappingVisitor visitor, |
- NominalTypeAnnotation node, |
+ TypeAnnotation node, |
List<ResolutionDartType> typeVariables, |
- List<ResolutionDartType> arguments, |
- List<List<String>> visibleTypeParameterNames) { |
+ List<ResolutionDartType> arguments) { |
if (node.typeArguments == null) { |
return false; |
} |
@@ -461,8 +283,8 @@ class TypeResolver { |
typeArguments.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT); |
typeArgumentCountMismatch = true; |
} |
- ResolutionDartType argType = _resolveTypeAnnotation( |
- visitor, typeArguments.head, visibleTypeParameterNames); |
+ ResolutionDartType argType = |
+ resolveTypeAnnotation(visitor, typeArguments.head); |
// TODO(karlklose): rewrite to not modify [arguments]. |
arguments.add(argType); |
} |