| Index: pkg/compiler/lib/src/resolution/class_hierarchy.dart
|
| diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
|
| index 78e2341c0ef1a1dd09931b6158b89dbda6a19927..823b5deaf664a9760e6a3de857942e492621d0b5 100644
|
| --- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart
|
| +++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
|
| @@ -5,52 +5,37 @@
|
| library dart2js.resolution.class_hierarchy;
|
|
|
| import '../common.dart';
|
| -import '../common/resolution.dart' show
|
| - Feature;
|
| -import '../compiler.dart' show
|
| - Compiler;
|
| -import '../core_types.dart' show
|
| - CoreClasses,
|
| - CoreTypes;
|
| +import '../common/resolution.dart' show Feature;
|
| +import '../compiler.dart' show Compiler;
|
| +import '../core_types.dart' show CoreClasses, CoreTypes;
|
| import '../dart_types.dart';
|
| import '../elements/elements.dart';
|
| -import '../elements/modelx.dart' show
|
| - BaseClassElementX,
|
| - ErroneousElementX,
|
| - MixinApplicationElementX,
|
| - SynthesizedConstructorElementX,
|
| - TypeVariableElementX,
|
| - UnnamedMixinApplicationElementX;
|
| -import '../ordered_typeset.dart' show
|
| - OrderedTypeSet,
|
| - OrderedTypeSetBuilder;
|
| +import '../elements/modelx.dart'
|
| + show
|
| + BaseClassElementX,
|
| + ErroneousElementX,
|
| + MixinApplicationElementX,
|
| + SynthesizedConstructorElementX,
|
| + TypeVariableElementX,
|
| + UnnamedMixinApplicationElementX;
|
| +import '../ordered_typeset.dart' show OrderedTypeSet, OrderedTypeSetBuilder;
|
| import '../tree/tree.dart';
|
| -import '../util/util.dart' show
|
| - Link,
|
| - Setlet;
|
| -import '../universe/call_structure.dart' show
|
| - CallStructure;
|
| +import '../util/util.dart' show Link, Setlet;
|
| +import '../universe/call_structure.dart' show CallStructure;
|
|
|
| import 'enum_creator.dart';
|
| -import 'members.dart' show
|
| - lookupInScope;
|
| -import 'registry.dart' show
|
| - ResolutionRegistry;
|
| -import 'resolution_common.dart' show
|
| - CommonResolverVisitor,
|
| - MappingVisitor;
|
| -import 'scope.dart' show
|
| - Scope,
|
| - TypeDeclarationScope;
|
| +import 'members.dart' show lookupInScope;
|
| +import 'registry.dart' show ResolutionRegistry;
|
| +import 'resolution_common.dart' show CommonResolverVisitor, MappingVisitor;
|
| +import 'scope.dart' show Scope, TypeDeclarationScope;
|
|
|
| class TypeDefinitionVisitor extends MappingVisitor<DartType> {
|
| Scope scope;
|
| final TypeDeclarationElement enclosingElement;
|
| TypeDeclarationElement get element => enclosingElement;
|
|
|
| - TypeDefinitionVisitor(Compiler compiler,
|
| - TypeDeclarationElement element,
|
| - ResolutionRegistry registry)
|
| + TypeDefinitionVisitor(Compiler compiler, TypeDeclarationElement element,
|
| + ResolutionRegistry registry)
|
| : this.enclosingElement = element,
|
| scope = Scope.buildEnclosingScope(element),
|
| super(compiler, registry);
|
| @@ -59,7 +44,6 @@ class TypeDefinitionVisitor extends MappingVisitor<DartType> {
|
|
|
| DartType get objectType => coreTypes.objectType;
|
|
|
| -
|
| void resolveTypeVariableBounds(NodeList node) {
|
| if (node == null) return;
|
|
|
| @@ -83,8 +67,8 @@ class TypeDefinitionVisitor extends MappingVisitor<DartType> {
|
|
|
| TypeVariableElementX variableElement = typeVariable.element;
|
| if (typeNode.bound != null) {
|
| - DartType boundType = typeResolver.resolveTypeAnnotation(
|
| - this, typeNode.bound);
|
| + DartType boundType =
|
| + typeResolver.resolveTypeAnnotation(this, typeNode.bound);
|
| variableElement.boundCache = boundType;
|
|
|
| void checkTypeVariableBound() {
|
| @@ -134,18 +118,17 @@ class TypeDefinitionVisitor extends MappingVisitor<DartType> {
|
| class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| BaseClassElementX get element => enclosingElement;
|
|
|
| - ClassResolverVisitor(Compiler compiler,
|
| - ClassElement classElement,
|
| - ResolutionRegistry registry)
|
| - : super(compiler, classElement, registry);
|
| + ClassResolverVisitor(
|
| + Compiler compiler, ClassElement classElement, ResolutionRegistry registry)
|
| + : super(compiler, classElement, registry);
|
|
|
| DartType visitClassNode(ClassNode node) {
|
| if (element == null) {
|
| throw reporter.internalError(node, 'element is null');
|
| }
|
| if (element.resolutionState != STATE_STARTED) {
|
| - throw reporter.internalError(element,
|
| - 'cyclic resolution of class $element');
|
| + throw reporter.internalError(
|
| + element, 'cyclic resolution of class $element');
|
| }
|
|
|
| element.computeType(resolution);
|
| @@ -163,8 +146,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| DartType supertype = resolveSupertype(element, superMixin.superclass);
|
| Link<Node> link = superMixin.mixins.nodes;
|
| while (!link.isEmpty) {
|
| - supertype = applyMixin(supertype,
|
| - checkMixinType(link.head), link.head);
|
| + supertype =
|
| + applyMixin(supertype, checkMixinType(link.head), link.head);
|
| link = link.tail;
|
| }
|
| element.supertype = supertype;
|
| @@ -181,8 +164,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| // Avoid making the superclass (usually Object) extend itself.
|
| if (element != superElement) {
|
| if (superElement == null) {
|
| - reporter.internalError(node,
|
| - "Cannot resolve default superclass for $element.");
|
| + reporter.internalError(
|
| + node, "Cannot resolve default superclass for $element.");
|
| } else {
|
| superElement.ensureResolved(resolution);
|
| }
|
| @@ -205,23 +188,21 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| // TODO(ahe): Why is this a compile-time error? Or if it is an error,
|
| // why do we bother to registerThrowNoSuchMethod below?
|
| reporter.reportErrorMessage(node, kind, arguments);
|
| - superMember = new ErroneousElementX(
|
| - kind, arguments, '', element);
|
| + superMember = new ErroneousElementX(kind, arguments, '', element);
|
| registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
|
| } else if (!superMember.isGenerativeConstructor) {
|
| - MessageKind kind = MessageKind.SUPER_CALL_TO_FACTORY;
|
| - Map arguments = {'className': element.superclass.name};
|
| - // TODO(ahe): Why is this a compile-time error? Or if it is an error,
|
| - // why do we bother to registerThrowNoSuchMethod below?
|
| - reporter.reportErrorMessage(node, kind, arguments);
|
| - superMember = new ErroneousElementX(
|
| - kind, arguments, '', element);
|
| - registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
|
| + MessageKind kind = MessageKind.SUPER_CALL_TO_FACTORY;
|
| + Map arguments = {'className': element.superclass.name};
|
| + // TODO(ahe): Why is this a compile-time error? Or if it is an error,
|
| + // why do we bother to registerThrowNoSuchMethod below?
|
| + reporter.reportErrorMessage(node, kind, arguments);
|
| + superMember = new ErroneousElementX(kind, arguments, '', element);
|
| + registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
|
| } else {
|
| ConstructorElement superConstructor = superMember;
|
| superConstructor.computeType(resolution);
|
| - if (!CallStructure.NO_ARGS.signatureApplies(
|
| - superConstructor.functionSignature)) {
|
| + if (!CallStructure.NO_ARGS
|
| + .signatureApplies(superConstructor.functionSignature)) {
|
| MessageKind kind = MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT;
|
| reporter.reportErrorMessage(node, kind);
|
| superMember = new ErroneousElementX(kind, {}, '', element);
|
| @@ -243,8 +224,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| throw reporter.internalError(node, 'element is null');
|
| }
|
| if (element.resolutionState != STATE_STARTED) {
|
| - throw reporter.internalError(element,
|
| - 'cyclic resolution of class $element');
|
| + throw reporter.internalError(
|
| + element, 'cyclic resolution of class $element');
|
| }
|
|
|
| InterfaceType enumType = element.computeType(resolution);
|
| @@ -254,9 +235,7 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
|
|
| if (node.names.nodes.isEmpty) {
|
| reporter.reportErrorMessage(
|
| - node,
|
| - MessageKind.EMPTY_ENUM_DECLARATION,
|
| - {'enumName': element.name});
|
| + node, MessageKind.EMPTY_ENUM_DECLARATION, {'enumName': element.name});
|
| }
|
|
|
| EnumCreator creator =
|
| @@ -271,22 +250,14 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| DartType mixinType = resolveType(mixinNode);
|
| if (isBlackListed(mixinType)) {
|
| reporter.reportErrorMessage(
|
| - mixinNode,
|
| - MessageKind.CANNOT_MIXIN,
|
| - {'type': mixinType});
|
| + mixinNode, MessageKind.CANNOT_MIXIN, {'type': mixinType});
|
| } else if (mixinType.isTypeVariable) {
|
| - reporter.reportErrorMessage(
|
| - mixinNode,
|
| - MessageKind.CLASS_NAME_EXPECTED);
|
| + reporter.reportErrorMessage(mixinNode, MessageKind.CLASS_NAME_EXPECTED);
|
| } else if (mixinType.isMalformed) {
|
| - reporter.reportErrorMessage(
|
| - mixinNode,
|
| - MessageKind.CANNOT_MIXIN_MALFORMED,
|
| + reporter.reportErrorMessage(mixinNode, MessageKind.CANNOT_MIXIN_MALFORMED,
|
| {'className': element.name, 'malformedType': mixinType});
|
| } else if (mixinType.isEnumType) {
|
| - reporter.reportErrorMessage(
|
| - mixinNode,
|
| - MessageKind.CANNOT_MIXIN_ENUM,
|
| + reporter.reportErrorMessage(mixinNode, MessageKind.CANNOT_MIXIN_ENUM,
|
| {'className': element.name, 'enumType': mixinType});
|
| }
|
| return mixinType;
|
| @@ -297,16 +268,15 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| throw reporter.internalError(node, 'element is null');
|
| }
|
| if (element.resolutionState != STATE_STARTED) {
|
| - throw reporter.internalError(element,
|
| - 'cyclic resolution of class $element');
|
| + throw reporter.internalError(
|
| + element, 'cyclic resolution of class $element');
|
| }
|
|
|
| if (identical(node.classKeyword.stringValue, 'typedef')) {
|
| // TODO(aprelev@gmail.com): Remove this deprecation diagnostic
|
| // together with corresponding TODO in parser.dart.
|
| reporter.reportWarningMessage(
|
| - node.classKeyword,
|
| - MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX);
|
| + node.classKeyword, MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX);
|
| }
|
|
|
| element.computeType(resolution);
|
| @@ -329,11 +299,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| String superName = supertype.name;
|
| String mixinName = mixinType.name;
|
| MixinApplicationElementX mixinApplication =
|
| - new UnnamedMixinApplicationElementX(
|
| - "${superName}+${mixinName}",
|
| - element.compilationUnit,
|
| - compiler.getNextFreeClassId(),
|
| - node);
|
| + new UnnamedMixinApplicationElementX("${superName}+${mixinName}",
|
| + element.compilationUnit, compiler.getNextFreeClassId(), node);
|
| // Create synthetic type variables for the mixin application.
|
| List<DartType> typeVariables = <DartType>[];
|
| int index = 0;
|
| @@ -364,8 +331,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| // Replace the synthetic type variables by the original type variables in
|
| // the returned type (which should be the type actually extended).
|
| InterfaceType mixinThisType = mixinApplication.thisType;
|
| - return mixinThisType.subst(element.typeVariables,
|
| - mixinThisType.typeArguments);
|
| + return mixinThisType.subst(
|
| + element.typeVariables, mixinThisType.typeArguments);
|
| }
|
|
|
| bool isDefaultConstructor(FunctionElement constructor) {
|
| @@ -374,8 +341,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| return constructor.functionSignature.parameterCount == 0;
|
| }
|
|
|
| - FunctionElement createForwardingConstructor(ConstructorElement target,
|
| - ClassElement enclosing) {
|
| + FunctionElement createForwardingConstructor(
|
| + ConstructorElement target, ClassElement enclosing) {
|
| FunctionElement constructor =
|
| new SynthesizedConstructorElementX.notForDefault(
|
| target.name, target, enclosing);
|
| @@ -383,10 +350,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| return constructor;
|
| }
|
|
|
| - void doApplyMixinTo(
|
| - MixinApplicationElementX mixinApplication,
|
| - DartType supertype,
|
| - DartType mixinType) {
|
| + void doApplyMixinTo(MixinApplicationElementX mixinApplication,
|
| + DartType supertype, DartType mixinType) {
|
| Node node = mixinApplication.parseNode(resolution.parsing);
|
|
|
| if (mixinApplication.supertype != null) {
|
| @@ -402,8 +367,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| NamedMixinApplication namedMixinApplication =
|
| node.asNamedMixinApplication();
|
| Link<DartType> interfaces = (namedMixinApplication != null)
|
| - ? resolveInterfaces(namedMixinApplication.interfaces,
|
| - namedMixinApplication.superclass)
|
| + ? resolveInterfaces(
|
| + namedMixinApplication.interfaces, namedMixinApplication.superclass)
|
| : const Link<DartType>();
|
|
|
| // The class that is the result of a mixin application implements
|
| @@ -416,8 +381,8 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| }
|
| mixinApplication.interfaces = interfaces;
|
| } else {
|
| - assert(invariant(mixinApplication,
|
| - mixinApplication.hasIncompleteHierarchy));
|
| + assert(
|
| + invariant(mixinApplication, mixinApplication.hasIncompleteHierarchy));
|
| }
|
|
|
| ClassElement superclass = supertype.element;
|
| @@ -449,13 +414,13 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| calculateAllSupertypes(mixinApplication);
|
| }
|
|
|
| - InterfaceType resolveMixinFor(MixinApplicationElement mixinApplication,
|
| - DartType mixinType) {
|
| + InterfaceType resolveMixinFor(
|
| + MixinApplicationElement mixinApplication, DartType mixinType) {
|
| ClassElement mixin = mixinType.element;
|
| mixin.ensureResolved(resolution);
|
|
|
| // Check for cycles in the mixin chain.
|
| - ClassElement previous = mixinApplication; // For better error messages.
|
| + ClassElement previous = mixinApplication; // For better error messages.
|
| ClassElement current = mixin;
|
| while (current != null && current.isMixinApplication) {
|
| MixinApplicationElement currentMixinApplication = current;
|
| @@ -490,21 +455,16 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| {'className': element.name, 'malformedType': supertype});
|
| return objectType;
|
| } else if (supertype.isEnumType) {
|
| - reporter.reportErrorMessage(
|
| - superclass,
|
| - MessageKind.CANNOT_EXTEND_ENUM,
|
| + reporter.reportErrorMessage(superclass, MessageKind.CANNOT_EXTEND_ENUM,
|
| {'className': element.name, 'enumType': supertype});
|
| return objectType;
|
| } else if (!supertype.isInterfaceType) {
|
| reporter.reportErrorMessage(
|
| - superclass.typeName,
|
| - MessageKind.CLASS_NAME_EXPECTED);
|
| + superclass.typeName, MessageKind.CLASS_NAME_EXPECTED);
|
| return objectType;
|
| } else if (isBlackListed(supertype)) {
|
| reporter.reportErrorMessage(
|
| - superclass,
|
| - MessageKind.CANNOT_EXTEND,
|
| - {'type': supertype});
|
| + superclass, MessageKind.CANNOT_EXTEND, {'type': supertype});
|
| return objectType;
|
| }
|
| }
|
| @@ -544,16 +504,12 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| {'type': interfaceType});
|
| }
|
| if (result.contains(interfaceType)) {
|
| - reporter.reportErrorMessage(
|
| - link.head,
|
| - MessageKind.DUPLICATE_IMPLEMENTS,
|
| - {'type': interfaceType});
|
| + reporter.reportErrorMessage(link.head,
|
| + MessageKind.DUPLICATE_IMPLEMENTS, {'type': interfaceType});
|
| }
|
| result = result.prepend(interfaceType);
|
| if (isBlackListed(interfaceType)) {
|
| - reporter.reportErrorMessage(
|
| - link.head,
|
| - MessageKind.CANNOT_IMPLEMENT,
|
| + reporter.reportErrorMessage(link.head, MessageKind.CANNOT_IMPLEMENT,
|
| {'type': interfaceType});
|
| }
|
| }
|
| @@ -582,10 +538,9 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
| if (cls.allSupertypesAndSelf != null) return;
|
| final DartType supertype = cls.supertype;
|
| if (supertype != null) {
|
| - cls.allSupertypesAndSelf =
|
| - new OrderedTypeSetBuilder(
|
| - cls, reporter: reporter, objectType: coreTypes.objectType)
|
| - .createOrderedTypeSet(supertype, cls.interfaces);
|
| + cls.allSupertypesAndSelf = new OrderedTypeSetBuilder(cls,
|
| + reporter: reporter, objectType: coreTypes.objectType)
|
| + .createOrderedTypeSet(supertype, cls.interfaces);
|
| } else {
|
| assert(cls == compiler.coreClasses.objectClass);
|
| cls.allSupertypesAndSelf =
|
| @@ -595,16 +550,15 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
|
|
|
| isBlackListed(DartType type) {
|
| LibraryElement lib = element.library;
|
| - return
|
| - !identical(lib, compiler.coreLibrary) &&
|
| - !compiler.backend.isBackendLibrary(lib) &&
|
| - (type.isDynamic ||
|
| - type == coreTypes.boolType ||
|
| - type == coreTypes.numType ||
|
| - type == coreTypes.intType ||
|
| - type == coreTypes.doubleType ||
|
| - type == coreTypes.stringType ||
|
| - type == coreTypes.nullType);
|
| + return !identical(lib, compiler.coreLibrary) &&
|
| + !compiler.backend.isBackendLibrary(lib) &&
|
| + (type.isDynamic ||
|
| + type == coreTypes.boolType ||
|
| + type == coreTypes.numType ||
|
| + type == coreTypes.intType ||
|
| + type == coreTypes.doubleType ||
|
| + type == coreTypes.stringType ||
|
| + type == coreTypes.nullType);
|
| }
|
| }
|
|
|
| @@ -613,9 +567,9 @@ class ClassSupertypeResolver extends CommonResolverVisitor {
|
| ClassElement classElement;
|
|
|
| ClassSupertypeResolver(Compiler compiler, ClassElement cls)
|
| - : context = Scope.buildEnclosingScope(cls),
|
| - this.classElement = cls,
|
| - super(compiler);
|
| + : context = Scope.buildEnclosingScope(cls),
|
| + this.classElement = cls,
|
| + super(compiler);
|
|
|
| CoreClasses get coreClasses => compiler.coreClasses;
|
|
|
| @@ -688,10 +642,8 @@ class ClassSupertypeResolver extends CommonResolverVisitor {
|
| Identifier selector = node.selector.asIdentifier();
|
| var e = prefixElement.lookupLocalMember(selector.source);
|
| if (e == null || !e.impliesType) {
|
| - reporter.reportErrorMessage(
|
| - node.selector,
|
| - MessageKind.CANNOT_RESOLVE_TYPE,
|
| - {'typeName': node.selector});
|
| + reporter.reportErrorMessage(node.selector,
|
| + MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': node.selector});
|
| return;
|
| }
|
| loadSupertype(e, node);
|
|
|