| 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_helpers.dart'; | 7 import 'package:compiler/src/js_backend/backend_helpers.dart'; |
| 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 typesSeen..add(type1)..add(type2); | 69 typesSeen..add(type1)..add(type2); |
| 70 var pair1 = new Pair(type1, type2); | 70 var pair1 = new Pair(type1, type2); |
| 71 var pair2 = new Pair(type2, type1); | 71 var pair2 = new Pair(type2, type1); |
| 72 if (pairsSeen.contains(pair1)) { | 72 if (pairsSeen.contains(pair1)) { |
| 73 Expect.isFalse(true, 'Redundant rule ($type1, $type2, ...)'); | 73 Expect.isFalse(true, 'Redundant rule ($type1, $type2, ...)'); |
| 74 } | 74 } |
| 75 pairsSeen..add(pair1)..add(pair2); | 75 pairsSeen..add(pair1)..add(pair2); |
| 76 | 76 |
| 77 var r1 = operate(type1, type2); | 77 var r1 = operate(type1, type2); |
| 78 var r2 = operate(type2, type1); | 78 var r2 = operate(type2, type1); |
| 79 Expect.equals(result, r1, | 79 Expect.equals(result, r1); |
| 80 "Unexpected result of $name($type1,$type2)"); | 80 Expect.equals(r1, r2, 'symmetry violation'); |
| 81 Expect.equals(r1, r2, 'Symmetry violation of $name($type1,$type2)'); | |
| 82 } | 81 } |
| 83 | 82 |
| 84 void check(type1, type2, predicate) { | 83 void check(type1, type2, predicate) { |
| 85 typesSeen..add(type1)..add(type2); | 84 typesSeen..add(type1)..add(type2); |
| 86 var pair = new Pair(type1, type2); | 85 var pair = new Pair(type1, type2); |
| 87 pairsSeen..add(pair); | 86 pairsSeen..add(pair); |
| 88 var result = operate(type1, type2); | 87 var result = operate(type1, type2); |
| 89 Expect.isTrue(predicate(result)); | 88 Expect.isTrue(predicate(result)); |
| 90 } | 89 } |
| 91 | 90 |
| (...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 | 724 |
| 726 void testRegressions(MockCompiler compiler) { | 725 void testRegressions(MockCompiler compiler) { |
| 727 TypeMask nonNullPotentialString = new TypeMask.nonNullSubtype( | 726 TypeMask nonNullPotentialString = new TypeMask.nonNullSubtype( |
| 728 patternClass, compiler.world); | 727 patternClass, compiler.world); |
| 729 Expect.equals( | 728 Expect.equals( |
| 730 potentialString, jsStringOrNull.union( | 729 potentialString, jsStringOrNull.union( |
| 731 nonNullPotentialString, compiler.world)); | 730 nonNullPotentialString, compiler.world)); |
| 732 } | 731 } |
| 733 | 732 |
| 734 void main() { | 733 void main() { |
| 735 asyncTest(() async { | 734 asyncTest(() => MockCompiler.create((MockCompiler compiler) { |
| 736 MockCompiler compiler = new MockCompiler.internal(); | |
| 737 await compiler.init(""" | |
| 738 class PatternImpl implements Pattern {} | |
| 739 """); | |
| 740 JavaScriptBackend backend = compiler.backend; | 735 JavaScriptBackend backend = compiler.backend; |
| 741 BackendHelpers helpers = backend.helpers; | 736 BackendHelpers helpers = backend.helpers; |
| 742 World world = compiler.world; | 737 World world = compiler.world; |
| 743 helpers.interceptorsLibrary.forEachLocalMember((element) { | 738 helpers.interceptorsLibrary.forEachLocalMember((element) { |
| 744 if (element.isClass) { | 739 if (element.isClass) { |
| 745 element.ensureResolved(compiler.resolution); | 740 element.ensureResolved(compiler.resolution); |
| 746 backend.registerInstantiatedType( | 741 backend.registerInstantiatedType( |
| 747 element.rawType, | 742 element.rawType, |
| 748 compiler.enqueuer.resolution, | 743 compiler.enqueuer.resolution, |
| 749 compiler.globalDependencies); | 744 compiler.globalDependencies); |
| 750 } | 745 } |
| 751 }); | 746 }); |
| 752 ClassElement patternImplClass = compiler.mainApp.find('PatternImpl'); | |
| 753 patternImplClass.ensureResolved(compiler.resolution); | |
| 754 | |
| 755 backend.registerInstantiatedType( | 747 backend.registerInstantiatedType( |
| 756 compiler.coreTypes.mapType(), | 748 compiler.coreTypes.mapType(), |
| 757 compiler.enqueuer.resolution, | 749 compiler.enqueuer.resolution, |
| 758 compiler.globalDependencies); | 750 compiler.globalDependencies); |
| 759 backend.registerInstantiatedType( | 751 backend.registerInstantiatedType( |
| 760 compiler.coreTypes.functionType, | 752 compiler.coreTypes.functionType, |
| 761 compiler.enqueuer.resolution, | 753 compiler.enqueuer.resolution, |
| 762 compiler.globalDependencies); | 754 compiler.globalDependencies); |
| 763 backend.registerInstantiatedType( | |
| 764 patternImplClass.rawType, | |
| 765 compiler.enqueuer.resolution, | |
| 766 compiler.globalDependencies); | |
| 767 compiler.world.populate(); | 755 compiler.world.populate(); |
| 768 | 756 |
| 769 // Grab hold of a supertype for String so we can produce potential | 757 // Grab hold of a supertype for String so we can produce potential |
| 770 // string types. | 758 // string types. |
| 771 patternClass = compiler.coreLibrary.find('Pattern'); | 759 patternClass = compiler.coreLibrary.find('Pattern'); |
| 772 | 760 |
| 773 nonPrimitive1 = new TypeMask.nonNullSubtype( | 761 nonPrimitive1 = new TypeMask.nonNullSubtype( |
| 774 compiler.coreClasses.mapClass, world); | 762 compiler.coreClasses.mapClass, world); |
| 775 nonPrimitive2 = new TypeMask.nonNullSubtype( | 763 nonPrimitive2 = new TypeMask.nonNullSubtype( |
| 776 compiler.coreClasses.functionClass, world); | 764 compiler.coreClasses.functionClass, world); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 jsNumberOrNull = new TypeMask.subclass(helpers.jsNumberClass, world); | 798 jsNumberOrNull = new TypeMask.subclass(helpers.jsNumberClass, world); |
| 811 jsIntegerOrNull = new TypeMask.exact(helpers.jsIntClass, world); | 799 jsIntegerOrNull = new TypeMask.exact(helpers.jsIntClass, world); |
| 812 jsDoubleOrNull = new TypeMask.exact(helpers.jsDoubleClass, world); | 800 jsDoubleOrNull = new TypeMask.exact(helpers.jsDoubleClass, world); |
| 813 nullType = const TypeMask.empty(); | 801 nullType = const TypeMask.empty(); |
| 814 objectType = new TypeMask.nonNullSubclass( | 802 objectType = new TypeMask.nonNullSubclass( |
| 815 compiler.coreClasses.objectClass, world); | 803 compiler.coreClasses.objectClass, world); |
| 816 emptyType = const TypeMask.nonNullEmpty(); | 804 emptyType = const TypeMask.nonNullEmpty(); |
| 817 dynamicType = new TypeMask.subclass( | 805 dynamicType = new TypeMask.subclass( |
| 818 compiler.coreClasses.objectClass, world); | 806 compiler.coreClasses.objectClass, world); |
| 819 | 807 |
| 820 Expect.notEquals(emptyType, nonPrimitive1, | |
| 821 "nonPrimitive1 expected to be non-empty."); | |
| 822 Expect.notEquals(jsStringOrNull, potentialString, | |
| 823 "potentialString expected not to be exact JSString"); | |
| 824 Expect.notEquals(jsArrayOrNull, potentialArray, | |
| 825 "potentialArray expected not to be JSArray subclass"); | |
| 826 | |
| 827 testUnion(compiler); | 808 testUnion(compiler); |
| 828 testIntersection(compiler); | 809 testIntersection(compiler); |
| 829 testRegressions(compiler); | 810 testRegressions(compiler); |
| 830 }); | 811 })); |
| 831 } | 812 } |
| OLD | NEW |