| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library dart2js.resolution.class_hierarchy; | 5 library dart2js.resolution.class_hierarchy; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../compiler.dart' show | 8 import '../compiler.dart' show |
| 9 Compiler; | 9 Compiler; |
| 10 import '../core_types.dart' show |
| 11 CoreClasses, |
| 12 CoreTypes; |
| 10 import '../dart_types.dart'; | 13 import '../dart_types.dart'; |
| 11 import '../elements/elements.dart'; | 14 import '../elements/elements.dart'; |
| 12 import '../elements/modelx.dart' show | 15 import '../elements/modelx.dart' show |
| 13 BaseClassElementX, | 16 BaseClassElementX, |
| 14 ErroneousElementX, | 17 ErroneousElementX, |
| 15 MixinApplicationElementX, | 18 MixinApplicationElementX, |
| 16 SynthesizedConstructorElementX, | 19 SynthesizedConstructorElementX, |
| 17 TypeVariableElementX; | 20 TypeVariableElementX; |
| 18 import '../ordered_typeset.dart' show | 21 import '../ordered_typeset.dart' show |
| 19 OrderedTypeSet, | 22 OrderedTypeSet, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 42 final TypeDeclarationElement enclosingElement; | 45 final TypeDeclarationElement enclosingElement; |
| 43 TypeDeclarationElement get element => enclosingElement; | 46 TypeDeclarationElement get element => enclosingElement; |
| 44 | 47 |
| 45 TypeDefinitionVisitor(Compiler compiler, | 48 TypeDefinitionVisitor(Compiler compiler, |
| 46 TypeDeclarationElement element, | 49 TypeDeclarationElement element, |
| 47 ResolutionRegistry registry) | 50 ResolutionRegistry registry) |
| 48 : this.enclosingElement = element, | 51 : this.enclosingElement = element, |
| 49 scope = Scope.buildEnclosingScope(element), | 52 scope = Scope.buildEnclosingScope(element), |
| 50 super(compiler, registry); | 53 super(compiler, registry); |
| 51 | 54 |
| 52 DartType get objectType => compiler.objectClass.rawType; | 55 DartType get objectType => compiler.coreTypes.objectType; |
| 53 | 56 |
| 54 void resolveTypeVariableBounds(NodeList node) { | 57 void resolveTypeVariableBounds(NodeList node) { |
| 55 if (node == null) return; | 58 if (node == null) return; |
| 56 | 59 |
| 57 Setlet<String> nameSet = new Setlet<String>(); | 60 Setlet<String> nameSet = new Setlet<String>(); |
| 58 // Resolve the bounds of type variables. | 61 // Resolve the bounds of type variables. |
| 59 Iterator<DartType> types = element.typeVariables.iterator; | 62 Iterator<DartType> types = element.typeVariables.iterator; |
| 60 Link<Node> nodeLink = node.nodes; | 63 Link<Node> nodeLink = node.nodes; |
| 61 while (!nodeLink.isEmpty) { | 64 while (!nodeLink.isEmpty) { |
| 62 types.moveNext(); | 65 types.moveNext(); |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 | 370 |
| 368 void doApplyMixinTo(MixinApplicationElementX mixinApplication, | 371 void doApplyMixinTo(MixinApplicationElementX mixinApplication, |
| 369 DartType supertype, | 372 DartType supertype, |
| 370 DartType mixinType) { | 373 DartType mixinType) { |
| 371 Node node = mixinApplication.parseNode(resolution.parsing); | 374 Node node = mixinApplication.parseNode(resolution.parsing); |
| 372 | 375 |
| 373 if (mixinApplication.supertype != null) { | 376 if (mixinApplication.supertype != null) { |
| 374 // [supertype] is not null if there was a cycle. | 377 // [supertype] is not null if there was a cycle. |
| 375 assert(invariant(node, compiler.compilationFailed)); | 378 assert(invariant(node, compiler.compilationFailed)); |
| 376 supertype = mixinApplication.supertype; | 379 supertype = mixinApplication.supertype; |
| 377 assert(invariant(node, supertype.element == compiler.objectClass)); | 380 assert(invariant(node, supertype.isObject)); |
| 378 } else { | 381 } else { |
| 379 mixinApplication.supertype = supertype; | 382 mixinApplication.supertype = supertype; |
| 380 } | 383 } |
| 381 | 384 |
| 382 // Named mixin application may have an 'implements' clause. | 385 // Named mixin application may have an 'implements' clause. |
| 383 NamedMixinApplication namedMixinApplication = | 386 NamedMixinApplication namedMixinApplication = |
| 384 node.asNamedMixinApplication(); | 387 node.asNamedMixinApplication(); |
| 385 Link<DartType> interfaces = (namedMixinApplication != null) | 388 Link<DartType> interfaces = (namedMixinApplication != null) |
| 386 ? resolveInterfaces(namedMixinApplication.interfaces, | 389 ? resolveInterfaces(namedMixinApplication.interfaces, |
| 387 namedMixinApplication.superclass) | 390 namedMixinApplication.superclass) |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 | 578 |
| 576 addAllSupertypes(allSupertypes, supertype); | 579 addAllSupertypes(allSupertypes, supertype); |
| 577 for (Link<DartType> interfaces = cls.interfaces; | 580 for (Link<DartType> interfaces = cls.interfaces; |
| 578 !interfaces.isEmpty; | 581 !interfaces.isEmpty; |
| 579 interfaces = interfaces.tail) { | 582 interfaces = interfaces.tail) { |
| 580 addAllSupertypes(allSupertypes, interfaces.head); | 583 addAllSupertypes(allSupertypes, interfaces.head); |
| 581 } | 584 } |
| 582 allSupertypes.add(compiler, cls.computeType(resolution)); | 585 allSupertypes.add(compiler, cls.computeType(resolution)); |
| 583 cls.allSupertypesAndSelf = allSupertypes.toTypeSet(); | 586 cls.allSupertypesAndSelf = allSupertypes.toTypeSet(); |
| 584 } else { | 587 } else { |
| 585 assert(identical(cls, compiler.objectClass)); | 588 assert(cls == compiler.coreClasses.objectClass); |
| 586 cls.allSupertypesAndSelf = | 589 cls.allSupertypesAndSelf = |
| 587 new OrderedTypeSet.singleton(cls.computeType(resolution)); | 590 new OrderedTypeSet.singleton(cls.computeType(resolution)); |
| 588 } | 591 } |
| 589 } | 592 } |
| 590 | 593 |
| 591 /** | 594 /** |
| 592 * Adds [type] and all supertypes of [type] to [allSupertypes] while | 595 * Adds [type] and all supertypes of [type] to [allSupertypes] while |
| 593 * substituting type variables. | 596 * substituting type variables. |
| 594 */ | 597 */ |
| 595 void addAllSupertypes(OrderedTypeSetBuilder allSupertypes, | 598 void addAllSupertypes(OrderedTypeSetBuilder allSupertypes, |
| 596 InterfaceType type) { | 599 InterfaceType type) { |
| 597 ClassElement classElement = type.element; | 600 ClassElement classElement = type.element; |
| 598 Link<DartType> supertypes = classElement.allSupertypes; | 601 Link<DartType> supertypes = classElement.allSupertypes; |
| 599 assert(invariant(element, supertypes != null, | 602 assert(invariant(element, supertypes != null, |
| 600 message: "Supertypes not computed on $classElement " | 603 message: "Supertypes not computed on $classElement " |
| 601 "during resolution of $element")); | 604 "during resolution of $element")); |
| 602 while (!supertypes.isEmpty) { | 605 while (!supertypes.isEmpty) { |
| 603 DartType supertype = supertypes.head; | 606 DartType supertype = supertypes.head; |
| 604 allSupertypes.add(compiler, supertype.substByContext(type)); | 607 allSupertypes.add(compiler, supertype.substByContext(type)); |
| 605 supertypes = supertypes.tail; | 608 supertypes = supertypes.tail; |
| 606 } | 609 } |
| 607 } | 610 } |
| 608 | 611 |
| 609 isBlackListed(DartType type) { | 612 isBlackListed(DartType type) { |
| 610 LibraryElement lib = element.library; | 613 LibraryElement lib = element.library; |
| 614 CoreTypes coreTypes = compiler.coreTypes; |
| 611 return | 615 return |
| 612 !identical(lib, compiler.coreLibrary) && | 616 !identical(lib, compiler.coreLibrary) && |
| 613 !compiler.backend.isBackendLibrary(lib) && | 617 !compiler.backend.isBackendLibrary(lib) && |
| 614 (type.isDynamic || | 618 (type.isDynamic || |
| 615 identical(type.element, compiler.boolClass) || | 619 type == coreTypes.boolType || |
| 616 identical(type.element, compiler.numClass) || | 620 type == coreTypes.numType || |
| 617 identical(type.element, compiler.intClass) || | 621 type == coreTypes.intType || |
| 618 identical(type.element, compiler.doubleClass) || | 622 type == coreTypes.doubleType || |
| 619 identical(type.element, compiler.stringClass) || | 623 type == coreTypes.stringType || |
| 620 identical(type.element, compiler.nullClass)); | 624 type == coreTypes.nullType); |
| 621 } | 625 } |
| 622 } | 626 } |
| 623 | 627 |
| 624 class ClassSupertypeResolver extends CommonResolverVisitor { | 628 class ClassSupertypeResolver extends CommonResolverVisitor { |
| 625 Scope context; | 629 Scope context; |
| 626 ClassElement classElement; | 630 ClassElement classElement; |
| 627 | 631 |
| 628 ClassSupertypeResolver(Compiler compiler, ClassElement cls) | 632 ClassSupertypeResolver(Compiler compiler, ClassElement cls) |
| 629 : context = Scope.buildEnclosingScope(cls), | 633 : context = Scope.buildEnclosingScope(cls), |
| 630 this.classElement = cls, | 634 this.classElement = cls, |
| 631 super(compiler); | 635 super(compiler); |
| 632 | 636 |
| 637 CoreClasses get coreClasses => compiler.coreClasses; |
| 638 |
| 633 void loadSupertype(ClassElement element, Node from) { | 639 void loadSupertype(ClassElement element, Node from) { |
| 634 if (!element.isResolved) { | 640 if (!element.isResolved) { |
| 635 compiler.resolver.loadSupertypes(element, from); | 641 compiler.resolver.loadSupertypes(element, from); |
| 636 element.ensureResolved(resolution); | 642 element.ensureResolved(resolution); |
| 637 } | 643 } |
| 638 } | 644 } |
| 639 | 645 |
| 640 void visitNodeList(NodeList node) { | 646 void visitNodeList(NodeList node) { |
| 641 if (node != null) { | 647 if (node != null) { |
| 642 for (Link<Node> link = node.nodes; !link.isEmpty; link = link.tail) { | 648 for (Link<Node> link = node.nodes; !link.isEmpty; link = link.tail) { |
| 643 link.head.accept(this); | 649 link.head.accept(this); |
| 644 } | 650 } |
| 645 } | 651 } |
| 646 } | 652 } |
| 647 | 653 |
| 648 void visitClassNode(ClassNode node) { | 654 void visitClassNode(ClassNode node) { |
| 649 if (node.superclass == null) { | 655 if (node.superclass == null) { |
| 650 if (!identical(classElement, compiler.objectClass)) { | 656 if (classElement != coreClasses.objectClass) { |
| 651 loadSupertype(compiler.objectClass, node); | 657 loadSupertype(coreClasses.objectClass, node); |
| 652 } | 658 } |
| 653 } else { | 659 } else { |
| 654 node.superclass.accept(this); | 660 node.superclass.accept(this); |
| 655 } | 661 } |
| 656 visitNodeList(node.interfaces); | 662 visitNodeList(node.interfaces); |
| 657 } | 663 } |
| 658 | 664 |
| 659 void visitEnum(Enum node) { | 665 void visitEnum(Enum node) { |
| 660 loadSupertype(compiler.objectClass, node); | 666 loadSupertype(coreClasses.objectClass, node); |
| 661 } | 667 } |
| 662 | 668 |
| 663 void visitMixinApplication(MixinApplication node) { | 669 void visitMixinApplication(MixinApplication node) { |
| 664 node.superclass.accept(this); | 670 node.superclass.accept(this); |
| 665 visitNodeList(node.mixins); | 671 visitNodeList(node.mixins); |
| 666 } | 672 } |
| 667 | 673 |
| 668 void visitNamedMixinApplication(NamedMixinApplication node) { | 674 void visitNamedMixinApplication(NamedMixinApplication node) { |
| 669 node.superclass.accept(this); | 675 node.superclass.accept(this); |
| 670 visitNodeList(node.mixins); | 676 visitNodeList(node.mixins); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 701 if (e == null || !e.impliesType) { | 707 if (e == null || !e.impliesType) { |
| 702 reporter.reportErrorMessage( | 708 reporter.reportErrorMessage( |
| 703 node.selector, | 709 node.selector, |
| 704 MessageKind.CANNOT_RESOLVE_TYPE, | 710 MessageKind.CANNOT_RESOLVE_TYPE, |
| 705 {'typeName': node.selector}); | 711 {'typeName': node.selector}); |
| 706 return; | 712 return; |
| 707 } | 713 } |
| 708 loadSupertype(e, node); | 714 loadSupertype(e, node); |
| 709 } | 715 } |
| 710 } | 716 } |
| OLD | NEW |