| 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 165790d2c8669387db8a84c3e4e0134ff83fe9dd..832279bdb0938e2a3aa871d516e92dd43510e521 100644
|
| --- a/pkg/compiler/lib/src/resolution/type_resolver.dart
|
| +++ b/pkg/compiler/lib/src/resolution/type_resolver.dart
|
| @@ -5,37 +5,28 @@
|
| library dart2js.resolution.types;
|
|
|
| import '../common.dart';
|
| -import '../common/resolution.dart' show
|
| - Feature,
|
| - Resolution;
|
| -import '../compiler.dart' show
|
| - Compiler;
|
| -import '../dart_backend/dart_backend.dart' show
|
| - DartBackend;
|
| +import '../common/resolution.dart' show Feature, Resolution;
|
| +import '../compiler.dart' show Compiler;
|
| +import '../dart_backend/dart_backend.dart' show DartBackend;
|
| import '../dart_types.dart';
|
| -import '../elements/elements.dart' show
|
| - AmbiguousElement,
|
| - ClassElement,
|
| - Element,
|
| - Elements,
|
| - ErroneousElement,
|
| - PrefixElement,
|
| - TypedefElement,
|
| - TypeVariableElement;
|
| -import '../elements/modelx.dart' show
|
| - ErroneousElementX;
|
| +import '../elements/elements.dart'
|
| + show
|
| + AmbiguousElement,
|
| + ClassElement,
|
| + Element,
|
| + Elements,
|
| + ErroneousElement,
|
| + PrefixElement,
|
| + TypedefElement,
|
| + TypeVariableElement;
|
| +import '../elements/modelx.dart' show ErroneousElementX;
|
| import '../tree/tree.dart';
|
| -import '../util/util.dart' show
|
| - Link;
|
| +import '../util/util.dart' show Link;
|
|
|
| -import 'members.dart' show
|
| - lookupInScope;
|
| -import 'registry.dart' show
|
| - ResolutionRegistry;
|
| -import 'resolution_common.dart' show
|
| - MappingVisitor;
|
| -import 'scope.dart' show
|
| - Scope;
|
| +import 'members.dart' show lookupInScope;
|
| +import 'registry.dart' show ResolutionRegistry;
|
| +import 'resolution_common.dart' show MappingVisitor;
|
| +import 'scope.dart' show Scope;
|
|
|
| class TypeResolver {
|
| final Compiler compiler;
|
| @@ -47,10 +38,9 @@ class TypeResolver {
|
| Resolution get resolution => compiler.resolution;
|
|
|
| /// Tries to resolve the type name as an element.
|
| - Element resolveTypeName(Identifier prefixName,
|
| - Identifier typeName,
|
| - Scope scope,
|
| - {bool deferredIsMalformed: true}) {
|
| + Element resolveTypeName(
|
| + Identifier prefixName, Identifier typeName, Scope scope,
|
| + {bool deferredIsMalformed: true}) {
|
| Element element;
|
| if (prefixName != null) {
|
| Element prefixElement =
|
| @@ -66,9 +56,7 @@ class TypeResolver {
|
| deferredIsMalformed &&
|
| compiler.backend is! DartBackend) {
|
| element = new ErroneousElementX(MessageKind.DEFERRED_TYPE_ANNOTATION,
|
| - {'node': typeName},
|
| - element.name,
|
| - element);
|
| + {'node': typeName}, element.name, element);
|
| }
|
| } else {
|
| // The caller of this method will create the ErroneousElement for
|
| @@ -82,8 +70,7 @@ class TypeResolver {
|
| }
|
|
|
| DartType resolveTypeAnnotation(MappingVisitor visitor, TypeAnnotation node,
|
| - {bool malformedIsError: false,
|
| - bool deferredIsMalformed: true}) {
|
| + {bool malformedIsError: false, bool deferredIsMalformed: true}) {
|
| ResolutionRegistry registry = visitor.registry;
|
|
|
| Identifier typeName;
|
| @@ -91,13 +78,14 @@ class TypeResolver {
|
|
|
| DartType checkNoTypeArguments(DartType type) {
|
| List<DartType> arguments = new List<DartType>();
|
| - bool hasTypeArgumentMismatch = resolveTypeArguments(
|
| - visitor, node, const <DartType>[], arguments);
|
| + bool hasTypeArgumentMismatch =
|
| + resolveTypeArguments(visitor, node, const <DartType>[], arguments);
|
| if (hasTypeArgumentMismatch) {
|
| return new MalformedType(
|
| new ErroneousElementX(MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH,
|
| {'type': node}, typeName.source, visitor.enclosingElement),
|
| - type, arguments);
|
| + type,
|
| + arguments);
|
| }
|
| return type;
|
| }
|
| @@ -124,34 +112,30 @@ class TypeResolver {
|
| }
|
|
|
| Element element = resolveTypeName(prefixName, typeName, visitor.scope,
|
| - deferredIsMalformed: deferredIsMalformed);
|
| + deferredIsMalformed: deferredIsMalformed);
|
|
|
| DartType reportFailureAndCreateType(
|
| - MessageKind messageKind,
|
| - Map messageArguments,
|
| + MessageKind messageKind, Map messageArguments,
|
| {DartType userProvidedBadType,
|
| - Element erroneousElement,
|
| - List<DiagnosticMessage> infos: const <DiagnosticMessage>[]}) {
|
| + Element erroneousElement,
|
| + List<DiagnosticMessage> infos: const <DiagnosticMessage>[]}) {
|
| if (malformedIsError) {
|
| reporter.reportError(
|
| - reporter.createMessage(node, messageKind, messageArguments),
|
| - infos);
|
| + reporter.createMessage(node, messageKind, messageArguments), infos);
|
| } else {
|
| registry.registerFeature(Feature.THROW_RUNTIME_ERROR);
|
| reporter.reportWarning(
|
| - reporter.createMessage(node, messageKind, messageArguments),
|
| - infos);
|
| + reporter.createMessage(node, messageKind, messageArguments), infos);
|
| }
|
| if (erroneousElement == null) {
|
| registry.registerFeature(Feature.THROW_RUNTIME_ERROR);
|
| - erroneousElement = new ErroneousElementX(
|
| - messageKind, messageArguments, typeName.source,
|
| - visitor.enclosingElement);
|
| + erroneousElement = new ErroneousElementX(messageKind, messageArguments,
|
| + typeName.source, visitor.enclosingElement);
|
| }
|
| List<DartType> arguments = <DartType>[];
|
| resolveTypeArguments(visitor, node, const <DartType>[], arguments);
|
| - return new MalformedType(erroneousElement,
|
| - userProvidedBadType, arguments);
|
| + return new MalformedType(
|
| + erroneousElement, userProvidedBadType, arguments);
|
| }
|
|
|
| // Try to construct the type from the element.
|
| @@ -161,8 +145,7 @@ class TypeResolver {
|
| } else if (element.isAmbiguous) {
|
| AmbiguousElement ambiguous = element;
|
| type = reportFailureAndCreateType(
|
| - ambiguous.messageKind,
|
| - ambiguous.messageArguments,
|
| + ambiguous.messageKind, ambiguous.messageArguments,
|
| infos: ambiguous.computeInfos(
|
| registry.mapping.analyzedElement, reporter));
|
| ;
|
| @@ -186,12 +169,13 @@ class TypeResolver {
|
| compiler.resolver.ensureClassWillBeResolvedInternal(cls);
|
| cls.computeType(resolution);
|
| List<DartType> arguments = <DartType>[];
|
| - bool hasTypeArgumentMismatch = resolveTypeArguments(
|
| - visitor, node, cls.typeVariables, arguments);
|
| + bool hasTypeArgumentMismatch =
|
| + resolveTypeArguments(visitor, node, cls.typeVariables, arguments);
|
| if (hasTypeArgumentMismatch) {
|
| - type = new BadInterfaceType(cls.declaration,
|
| - new InterfaceType.forUserProvidedBadType(cls.declaration,
|
| - arguments));
|
| + type = new BadInterfaceType(
|
| + cls.declaration,
|
| + new InterfaceType.forUserProvidedBadType(
|
| + cls.declaration, arguments));
|
| } else {
|
| if (arguments.isEmpty) {
|
| type = cls.rawType;
|
| @@ -237,13 +221,12 @@ class TypeResolver {
|
| }
|
| type = checkNoTypeArguments(type);
|
| } else {
|
| - reporter.internalError(node,
|
| - "Unexpected element kind ${element.kind}.");
|
| + reporter.internalError(
|
| + node, "Unexpected element kind ${element.kind}.");
|
| }
|
| if (addTypeVariableBoundsCheck) {
|
| registry.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK);
|
| - visitor.addDeferredAction(
|
| - visitor.enclosingElement,
|
| + visitor.addDeferredAction(visitor.enclosingElement,
|
| () => checkTypeVariableBounds(node, type));
|
| }
|
| }
|
| @@ -254,18 +237,18 @@ class TypeResolver {
|
| /// Checks the type arguments of [type] against the type variable bounds.
|
| void checkTypeVariableBounds(TypeAnnotation node, GenericType type) {
|
| void checkTypeVariableBound(_, DartType typeArgument,
|
| - TypeVariableType typeVariable,
|
| - DartType bound) {
|
| + TypeVariableType typeVariable, DartType bound) {
|
| if (!compiler.types.isSubtype(typeArgument, bound)) {
|
| reporter.reportWarningMessage(
|
| - node,
|
| - MessageKind.INVALID_TYPE_VARIABLE_BOUND,
|
| - {'typeVariable': typeVariable,
|
| - 'bound': bound,
|
| - 'typeArgument': typeArgument,
|
| - 'thisType': type.element.thisType});
|
| + node, MessageKind.INVALID_TYPE_VARIABLE_BOUND, {
|
| + 'typeVariable': typeVariable,
|
| + 'bound': bound,
|
| + 'typeArgument': typeArgument,
|
| + 'thisType': type.element.thisType
|
| + });
|
| }
|
| - };
|
| + }
|
| + ;
|
|
|
| compiler.types.checkTypeVariableBounds(type, checkTypeVariableBound);
|
| }
|
| @@ -276,10 +259,8 @@ class TypeResolver {
|
| * Returns [: true :] if the number of type arguments did not match the
|
| * number of type variables.
|
| */
|
| - bool resolveTypeArguments(MappingVisitor visitor,
|
| - TypeAnnotation node,
|
| - List<DartType> typeVariables,
|
| - List<DartType> arguments) {
|
| + bool resolveTypeArguments(MappingVisitor visitor, TypeAnnotation node,
|
| + List<DartType> typeVariables, List<DartType> arguments) {
|
| if (node.typeArguments == null) {
|
| return false;
|
| }
|
| @@ -287,8 +268,8 @@ class TypeResolver {
|
| int index = 0;
|
| bool typeArgumentCountMismatch = false;
|
| for (Link<Node> typeArguments = node.typeArguments.nodes;
|
| - !typeArguments.isEmpty;
|
| - typeArguments = typeArguments.tail, index++) {
|
| + !typeArguments.isEmpty;
|
| + typeArguments = typeArguments.tail, index++) {
|
| if (index > expectedVariables - 1) {
|
| reporter.reportWarningMessage(
|
| typeArguments.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT);
|
|
|