OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 import 'package:async_helper/async_helper.dart'; | 5 import 'package:async_helper/async_helper.dart'; |
6 import 'package:expect/expect.dart'; | 6 import 'package:expect/expect.dart'; |
7 import 'package:compiler/src/js_backend/backend.dart' show JavaScriptBackend; | 7 import 'package:compiler/src/js_backend/backend.dart' show JavaScriptBackend; |
8 import 'package:compiler/src/js_backend/js_backend.dart'; | 8 import 'package:compiler/src/js_backend/js_backend.dart'; |
9 import 'package:compiler/src/types/types.dart'; | 9 import 'package:compiler/src/types/types.dart'; |
10 import 'package:compiler/src/world.dart'; | 10 import 'package:compiler/src/world.dart'; |
(...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 | 742 |
743 void main() { | 743 void main() { |
744 asyncTest(() async { | 744 asyncTest(() async { |
745 MockCompiler compiler = new MockCompiler.internal(); | 745 MockCompiler compiler = new MockCompiler.internal(); |
746 await compiler.init(""" | 746 await compiler.init(""" |
747 class PatternImpl implements Pattern {} | 747 class PatternImpl implements Pattern {} |
748 """); | 748 """); |
749 JavaScriptBackend backend = compiler.backend; | 749 JavaScriptBackend backend = compiler.backend; |
750 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); | 750 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); |
751 LibraryElement interceptorsLibrary = | 751 LibraryElement interceptorsLibrary = |
752 compiler.commonElements.interceptorsLibrary; | 752 compiler.resolution.commonElements.interceptorsLibrary; |
753 interceptorsLibrary.forEachLocalMember((element) { | 753 interceptorsLibrary.forEachLocalMember((element) { |
754 if (element.isClass) { | 754 if (element.isClass) { |
755 element.ensureResolved(compiler.resolution); | 755 element.ensureResolved(compiler.resolution); |
756 impactBuilder | 756 impactBuilder |
757 .registerTypeUse(new TypeUse.instantiation(element.rawType)); | 757 .registerTypeUse(new TypeUse.instantiation(element.rawType)); |
758 } | 758 } |
759 }); | 759 }); |
760 LibraryElement mainApp = compiler.mainApp; | 760 LibraryElement mainApp = compiler.mainApp; |
761 ClassElement patternImplClass = mainApp.find('PatternImpl'); | 761 ClassElement patternImplClass = mainApp.find('PatternImpl'); |
762 patternImplClass.ensureResolved(compiler.resolution); | 762 patternImplClass.ensureResolved(compiler.resolution); |
763 | 763 |
764 impactBuilder.registerTypeUse( | 764 impactBuilder.registerTypeUse(new TypeUse.instantiation( |
765 new TypeUse.instantiation(compiler.commonElements.mapType())); | 765 compiler.resolution.commonElements.mapType())); |
766 impactBuilder.registerTypeUse( | 766 impactBuilder.registerTypeUse(new TypeUse.instantiation( |
767 new TypeUse.instantiation(compiler.commonElements.functionType)); | 767 compiler.resolution.commonElements.functionType)); |
768 impactBuilder | 768 impactBuilder |
769 .registerTypeUse(new TypeUse.instantiation(patternImplClass.rawType)); | 769 .registerTypeUse(new TypeUse.instantiation(patternImplClass.rawType)); |
770 compiler.enqueuer.resolution.applyImpact(impactBuilder); | 770 compiler.enqueuer.resolution.applyImpact(impactBuilder); |
771 backend.onResolutionEnd(); | 771 backend.onResolutionEnd(); |
772 compiler.closeResolution(); | 772 compiler.closeResolution(); |
773 ClosedWorld closedWorld = | 773 ClosedWorld closedWorld = |
774 compiler.resolutionWorldBuilder.closedWorldForTesting; | 774 compiler.resolutionWorldBuilder.closedWorldForTesting; |
775 | 775 |
776 // Grab hold of a supertype for String so we can produce potential | 776 // Grab hold of a supertype for String so we can produce potential |
777 // string types. | 777 // string types. |
778 LibraryElement coreLibrary = closedWorld.commonElements.coreLibrary; | 778 LibraryElement coreLibrary = closedWorld.commonElements.coreLibrary; |
779 patternClass = coreLibrary.find('Pattern'); | 779 patternClass = coreLibrary.find('Pattern'); |
780 | 780 |
781 nonPrimitive1 = new TypeMask.nonNullSubtype( | 781 nonPrimitive1 = new TypeMask.nonNullSubtype( |
782 closedWorld.commonElements.mapClass, closedWorld); | 782 closedWorld.commonElements.mapClass, closedWorld); |
783 nonPrimitive2 = new TypeMask.nonNullSubtype( | 783 nonPrimitive2 = new TypeMask.nonNullSubtype( |
784 closedWorld.commonElements.functionClass, closedWorld); | 784 closedWorld.commonElements.functionClass, closedWorld); |
785 potentialArray = | 785 potentialArray = |
786 new TypeMask.subtype(closedWorld.commonElements.listClass, closedWorld); | 786 new TypeMask.subtype(closedWorld.commonElements.listClass, closedWorld); |
787 potentialString = new TypeMask.subtype(patternClass, closedWorld); | 787 potentialString = new TypeMask.subtype(patternClass, closedWorld); |
788 jsInterceptor = new TypeMask.nonNullSubclass( | 788 jsInterceptor = new TypeMask.nonNullSubclass( |
789 compiler.commonElements.jsInterceptorClass, closedWorld); | 789 closedWorld.commonElements.jsInterceptorClass, closedWorld); |
790 jsArrayOrNull = new TypeMask.subclass( | 790 jsArrayOrNull = new TypeMask.subclass( |
791 compiler.commonElements.jsArrayClass, closedWorld); | 791 closedWorld.commonElements.jsArrayClass, closedWorld); |
792 jsReadableArray = new TypeMask.nonNullSubclass( | 792 jsReadableArray = new TypeMask.nonNullSubclass( |
793 compiler.commonElements.jsArrayClass, closedWorld); | 793 closedWorld.commonElements.jsArrayClass, closedWorld); |
794 jsMutableArrayOrNull = new TypeMask.subclass( | 794 jsMutableArrayOrNull = new TypeMask.subclass( |
795 compiler.commonElements.jsMutableArrayClass, closedWorld); | 795 closedWorld.commonElements.jsMutableArrayClass, closedWorld); |
796 jsMutableArray = new TypeMask.nonNullSubclass( | 796 jsMutableArray = new TypeMask.nonNullSubclass( |
797 compiler.commonElements.jsMutableArrayClass, closedWorld); | 797 closedWorld.commonElements.jsMutableArrayClass, closedWorld); |
798 jsFixedArrayOrNull = new TypeMask.exact( | 798 jsFixedArrayOrNull = new TypeMask.exact( |
799 compiler.commonElements.jsFixedArrayClass, closedWorld); | 799 closedWorld.commonElements.jsFixedArrayClass, closedWorld); |
800 jsFixedArray = new TypeMask.nonNullExact( | 800 jsFixedArray = new TypeMask.nonNullExact( |
801 compiler.commonElements.jsFixedArrayClass, closedWorld); | 801 closedWorld.commonElements.jsFixedArrayClass, closedWorld); |
802 jsExtendableArrayOrNull = new TypeMask.exact( | 802 jsExtendableArrayOrNull = new TypeMask.exact( |
803 compiler.commonElements.jsExtendableArrayClass, closedWorld); | 803 closedWorld.commonElements.jsExtendableArrayClass, closedWorld); |
804 jsExtendableArray = new TypeMask.nonNullExact( | 804 jsExtendableArray = new TypeMask.nonNullExact( |
805 compiler.commonElements.jsExtendableArrayClass, closedWorld); | 805 closedWorld.commonElements.jsExtendableArrayClass, closedWorld); |
806 jsUnmodifiableArrayOrNull = new TypeMask.exact( | 806 jsUnmodifiableArrayOrNull = new TypeMask.exact( |
807 compiler.commonElements.jsUnmodifiableArrayClass, closedWorld); | 807 closedWorld.commonElements.jsUnmodifiableArrayClass, closedWorld); |
808 jsUnmodifiableArray = new TypeMask.nonNullExact( | 808 jsUnmodifiableArray = new TypeMask.nonNullExact( |
809 compiler.commonElements.jsUnmodifiableArrayClass, closedWorld); | 809 closedWorld.commonElements.jsUnmodifiableArrayClass, closedWorld); |
810 jsIndexableOrNull = new TypeMask.subtype( | 810 jsIndexableOrNull = new TypeMask.subtype( |
811 compiler.commonElements.jsIndexableClass, closedWorld); | 811 closedWorld.commonElements.jsIndexableClass, closedWorld); |
812 jsIndexable = new TypeMask.nonNullSubtype( | 812 jsIndexable = new TypeMask.nonNullSubtype( |
813 compiler.commonElements.jsIndexableClass, closedWorld); | 813 closedWorld.commonElements.jsIndexableClass, closedWorld); |
814 jsInterceptorOrNull = new TypeMask.subclass( | 814 jsInterceptorOrNull = new TypeMask.subclass( |
815 compiler.commonElements.jsInterceptorClass, closedWorld); | 815 closedWorld.commonElements.jsInterceptorClass, closedWorld); |
816 jsStringOrNull = | 816 jsStringOrNull = new TypeMask.exact( |
817 new TypeMask.exact(compiler.commonElements.jsStringClass, closedWorld); | 817 closedWorld.commonElements.jsStringClass, closedWorld); |
818 jsString = new TypeMask.nonNullExact( | 818 jsString = new TypeMask.nonNullExact( |
819 compiler.commonElements.jsStringClass, closedWorld); | 819 closedWorld.commonElements.jsStringClass, closedWorld); |
820 jsBoolean = new TypeMask.nonNullExact( | 820 jsBoolean = new TypeMask.nonNullExact( |
821 compiler.commonElements.jsBoolClass, closedWorld); | 821 closedWorld.commonElements.jsBoolClass, closedWorld); |
822 jsNumber = new TypeMask.nonNullSubclass( | 822 jsNumber = new TypeMask.nonNullSubclass( |
823 compiler.commonElements.jsNumberClass, closedWorld); | 823 closedWorld.commonElements.jsNumberClass, closedWorld); |
824 jsInteger = new TypeMask.nonNullExact( | 824 jsInteger = new TypeMask.nonNullExact( |
825 compiler.commonElements.jsIntClass, closedWorld); | 825 closedWorld.commonElements.jsIntClass, closedWorld); |
826 jsDouble = new TypeMask.nonNullExact( | 826 jsDouble = new TypeMask.nonNullExact( |
827 compiler.commonElements.jsDoubleClass, closedWorld); | 827 closedWorld.commonElements.jsDoubleClass, closedWorld); |
828 jsBooleanOrNull = | 828 jsBooleanOrNull = |
829 new TypeMask.exact(compiler.commonElements.jsBoolClass, closedWorld); | 829 new TypeMask.exact(closedWorld.commonElements.jsBoolClass, closedWorld); |
830 jsNumberOrNull = new TypeMask.subclass( | 830 jsNumberOrNull = new TypeMask.subclass( |
831 compiler.commonElements.jsNumberClass, closedWorld); | 831 closedWorld.commonElements.jsNumberClass, closedWorld); |
832 jsIntegerOrNull = | 832 jsIntegerOrNull = |
833 new TypeMask.exact(compiler.commonElements.jsIntClass, closedWorld); | 833 new TypeMask.exact(closedWorld.commonElements.jsIntClass, closedWorld); |
834 jsDoubleOrNull = | 834 jsDoubleOrNull = new TypeMask.exact( |
835 new TypeMask.exact(compiler.commonElements.jsDoubleClass, closedWorld); | 835 closedWorld.commonElements.jsDoubleClass, closedWorld); |
836 nullType = const TypeMask.empty(); | 836 nullType = const TypeMask.empty(); |
837 objectType = new TypeMask.nonNullSubclass( | 837 objectType = new TypeMask.nonNullSubclass( |
838 closedWorld.commonElements.objectClass, closedWorld); | 838 closedWorld.commonElements.objectClass, closedWorld); |
839 emptyType = const TypeMask.nonNullEmpty(); | 839 emptyType = const TypeMask.nonNullEmpty(); |
840 dynamicType = new TypeMask.subclass( | 840 dynamicType = new TypeMask.subclass( |
841 closedWorld.commonElements.objectClass, closedWorld); | 841 closedWorld.commonElements.objectClass, closedWorld); |
842 | 842 |
843 Expect.notEquals( | 843 Expect.notEquals( |
844 emptyType, nonPrimitive1, "nonPrimitive1 expected to be non-empty."); | 844 emptyType, nonPrimitive1, "nonPrimitive1 expected to be non-empty."); |
845 Expect.notEquals(jsStringOrNull, potentialString, | 845 Expect.notEquals(jsStringOrNull, potentialString, |
846 "potentialString expected not to be exact JSString"); | 846 "potentialString expected not to be exact JSString"); |
847 Expect.notEquals(jsArrayOrNull, potentialArray, | 847 Expect.notEquals(jsArrayOrNull, potentialArray, |
848 "potentialArray expected not to be JSArray subclass"); | 848 "potentialArray expected not to be JSArray subclass"); |
849 | 849 |
850 testUnion(compiler); | 850 testUnion(compiler); |
851 testIntersection(compiler); | 851 testIntersection(compiler); |
852 testRegressions(compiler); | 852 testRegressions(compiler); |
853 }); | 853 }); |
854 } | 854 } |
OLD | NEW |