| 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 |