OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 /// Equivalence test functions for data objects. | 5 /// Equivalence test functions for data objects. |
6 | 6 |
7 library dart2js.equivalence.functions; | 7 library dart2js.equivalence.functions; |
8 | 8 |
9 import 'package:expect/expect.dart'; | 9 import 'package:expect/expect.dart'; |
10 import 'package:compiler/src/common/resolution.dart'; | 10 import 'package:compiler/src/common/resolution.dart'; |
11 import 'package:compiler/src/common_elements.dart'; | 11 import 'package:compiler/src/common_elements.dart'; |
12 import 'package:compiler/src/compiler.dart'; | 12 import 'package:compiler/src/compiler.dart'; |
13 import 'package:compiler/src/elements/types.dart'; | 13 import 'package:compiler/src/elements/types.dart'; |
14 import 'package:compiler/src/elements/elements.dart'; | 14 import 'package:compiler/src/elements/elements.dart'; |
15 import 'package:compiler/src/elements/entities.dart'; | 15 import 'package:compiler/src/elements/entities.dart'; |
16 import 'package:compiler/src/enqueue.dart'; | 16 import 'package:compiler/src/enqueue.dart'; |
17 import 'package:compiler/src/js_backend/backend_usage.dart'; | 17 import 'package:compiler/src/js_backend/backend_usage.dart'; |
18 import 'package:compiler/src/js_backend/enqueuer.dart'; | 18 import 'package:compiler/src/js_backend/enqueuer.dart'; |
19 import 'package:compiler/src/js_backend/native_data.dart'; | 19 import 'package:compiler/src/js_backend/native_data.dart'; |
20 import 'package:compiler/src/js_backend/interceptor_data.dart'; | 20 import 'package:compiler/src/js_backend/interceptor_data.dart'; |
| 21 import 'package:compiler/src/js_emitter/code_emitter_task.dart'; |
| 22 import 'package:compiler/src/js_emitter/model.dart'; |
21 import 'package:compiler/src/serialization/equivalence.dart'; | 23 import 'package:compiler/src/serialization/equivalence.dart'; |
22 import 'package:compiler/src/universe/class_set.dart'; | 24 import 'package:compiler/src/universe/class_set.dart'; |
23 import 'package:compiler/src/universe/world_builder.dart'; | 25 import 'package:compiler/src/universe/world_builder.dart'; |
24 import 'package:compiler/src/world.dart'; | 26 import 'package:compiler/src/world.dart'; |
25 import 'check_helpers.dart'; | 27 import 'check_helpers.dart'; |
26 | 28 |
27 void checkClosedWorlds(ClosedWorld closedWorld1, ClosedWorld closedWorld2, | 29 void checkClosedWorlds(ClosedWorld closedWorld1, ClosedWorld closedWorld2, |
28 {TestStrategy strategy: const TestStrategy(), | 30 {TestStrategy strategy: const TestStrategy(), |
29 bool allowExtra: false, | 31 bool allowExtra: false, |
30 bool verbose: false, | 32 bool verbose: false, |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 | 628 |
627 bool _areEntitiesEquivalent(a, b) => areElementsEquivalent(a, b); | 629 bool _areEntitiesEquivalent(a, b) => areElementsEquivalent(a, b); |
628 | 630 |
629 void checkResolutionEnqueuers( | 631 void checkResolutionEnqueuers( |
630 BackendUsage backendUsage1, | 632 BackendUsage backendUsage1, |
631 BackendUsage backendUsage2, | 633 BackendUsage backendUsage2, |
632 ResolutionEnqueuer enqueuer1, | 634 ResolutionEnqueuer enqueuer1, |
633 ResolutionEnqueuer enqueuer2, | 635 ResolutionEnqueuer enqueuer2, |
634 {bool elementEquivalence(Entity a, Entity b): _areEntitiesEquivalent, | 636 {bool elementEquivalence(Entity a, Entity b): _areEntitiesEquivalent, |
635 bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, | 637 bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, |
636 bool elementFilter(Element element), | 638 bool elementFilter(Entity element), |
637 bool verbose: false, | 639 bool verbose: false, |
638 bool skipClassUsageTesting: false}) { | 640 bool skipClassUsageTesting: false}) { |
639 elementFilter ??= (_) => true; | 641 elementFilter ??= (_) => true; |
640 | 642 |
641 ResolutionWorldBuilderBase worldBuilder1 = enqueuer1.worldBuilder; | 643 ResolutionWorldBuilderBase worldBuilder1 = enqueuer1.worldBuilder; |
642 ResolutionWorldBuilderBase worldBuilder2 = enqueuer2.worldBuilder; | 644 ResolutionWorldBuilderBase worldBuilder2 = enqueuer2.worldBuilder; |
643 | 645 |
644 checkSets(worldBuilder1.instantiatedTypes, worldBuilder2.instantiatedTypes, | 646 checkSets(worldBuilder1.instantiatedTypes, worldBuilder2.instantiatedTypes, |
645 "Instantiated types mismatch", typeEquivalence, | 647 "Instantiated types mismatch", typeEquivalence, |
646 verbose: verbose); | 648 verbose: verbose); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 areAbstractUsagesEquivalent, | 791 areAbstractUsagesEquivalent, |
790 verbose: verbose); | 792 verbose: verbose); |
791 checkMaps( | 793 checkMaps( |
792 worldBuilder1.instanceMemberUsageForTesting, | 794 worldBuilder1.instanceMemberUsageForTesting, |
793 worldBuilder2.instanceMemberUsageForTesting, | 795 worldBuilder2.instanceMemberUsageForTesting, |
794 'instanceMemberUsageForTesting', | 796 'instanceMemberUsageForTesting', |
795 elementEquivalence, | 797 elementEquivalence, |
796 areAbstractUsagesEquivalent, | 798 areAbstractUsagesEquivalent, |
797 verbose: verbose); | 799 verbose: verbose); |
798 } | 800 } |
| 801 |
| 802 // TODO(johnniwinther): Check all emitter properties. |
| 803 void checkEmitters(CodeEmitterTask emitter1, CodeEmitterTask emitter2, |
| 804 {bool elementEquivalence(Entity a, Entity b): _areEntitiesEquivalent, |
| 805 bool typeEquivalence(DartType a, DartType b): areTypesEquivalent, |
| 806 bool elementFilter(Element element), |
| 807 bool verbose: false}) { |
| 808 checkPrograms( |
| 809 emitter1.emitter.programForTesting, emitter2.emitter.programForTesting); |
| 810 |
| 811 checkSets( |
| 812 emitter1.typeTestRegistry.rtiNeededClasses, |
| 813 emitter2.typeTestRegistry.rtiNeededClasses, |
| 814 "TypeTestRegistry rti needed classes mismatch", |
| 815 elementEquivalence, |
| 816 verbose: verbose); |
| 817 |
| 818 checkSets( |
| 819 emitter1.typeTestRegistry.checkedFunctionTypes, |
| 820 emitter2.typeTestRegistry.checkedFunctionTypes, |
| 821 "TypeTestRegistry checked function types mismatch", |
| 822 typeEquivalence, |
| 823 verbose: verbose); |
| 824 |
| 825 checkSets( |
| 826 emitter1.typeTestRegistry.checkedClasses, |
| 827 emitter2.typeTestRegistry.checkedClasses, |
| 828 "TypeTestRegistry checked classes mismatch", |
| 829 elementEquivalence, |
| 830 verbose: verbose); |
| 831 } |
| 832 |
| 833 // TODO(johnniwinther): Check all program properties. |
| 834 void checkEmitterPrograms(Program program1, Program program2) { |
| 835 checkLists(program1.fragments, program2.fragments, 'fragments', |
| 836 (a, b) => a.outputFileName == b.outputFileName, |
| 837 onSameElement: checkEmitterFragments); |
| 838 } |
| 839 |
| 840 // TODO(johnniwinther): Check all fragment properties. |
| 841 void checkEmitterFragments(Fragment fragment1, Fragment fragment2) { |
| 842 checkLists(fragment1.libraries, fragment2.libraries, 'libraries', |
| 843 (a, b) => a.element.canonicalUri == b.element.canonicalUri, |
| 844 onSameElement: checkEmitterLibraries); |
| 845 } |
| 846 |
| 847 // TODO(johnniwinther): Check all library properties. |
| 848 void checkEmitterLibraries(Library library1, Library library2) { |
| 849 checkLists(library1.classes, library2.classes, 'classes', |
| 850 (a, b) => a.element.name == b.element.name, |
| 851 onSameElement: checkEmitterClasses); |
| 852 // TODO(johnniwinther): Check static method properties. |
| 853 checkLists(library1.statics, library2.statics, 'statics', |
| 854 (a, b) => a.name.key == b.name.key); |
| 855 } |
| 856 |
| 857 // TODO(johnniwinther): Check all class properties. |
| 858 void checkEmitterClasses(Class class1, Class class2) { |
| 859 checkLists(class1.methods, class2.methods, 'methods', |
| 860 (a, b) => a.name.key == b.name.key); |
| 861 checkLists(class1.isChecks, class2.isChecks, 'isChecks', |
| 862 (a, b) => a.name.key == b.name.key); |
| 863 } |
OLD | NEW |