| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 // Tests that the closed world computed from [WorldImpact]s derived from kernel | 5 // Tests that the closed world computed from [WorldImpact]s derived from kernel |
| 6 // is equivalent to the original computed from resolution. | 6 // is equivalent to the original computed from resolution. |
| 7 library dart2js.kernel.closed_world_test; | 7 library dart2js.kernel.closed_world_test; |
| 8 | 8 |
| 9 import 'package:async_helper/async_helper.dart'; | 9 import 'package:async_helper/async_helper.dart'; |
| 10 import 'package:compiler/src/commandline_options.dart'; | 10 import 'package:compiler/src/commandline_options.dart'; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 import 'package:compiler/src/js_backend/type_variable_handler.dart'; | 25 import 'package:compiler/src/js_backend/type_variable_handler.dart'; |
| 26 import 'package:compiler/src/ssa/kernel_impact.dart'; | 26 import 'package:compiler/src/ssa/kernel_impact.dart'; |
| 27 import 'package:compiler/src/serialization/equivalence.dart'; | 27 import 'package:compiler/src/serialization/equivalence.dart'; |
| 28 import 'package:compiler/src/universe/world_builder.dart'; | 28 import 'package:compiler/src/universe/world_builder.dart'; |
| 29 import 'package:compiler/src/universe/world_impact.dart'; | 29 import 'package:compiler/src/universe/world_impact.dart'; |
| 30 import 'package:compiler/src/world.dart'; | 30 import 'package:compiler/src/world.dart'; |
| 31 import 'impact_test.dart'; | 31 import 'impact_test.dart'; |
| 32 import '../memory_compiler.dart'; | 32 import '../memory_compiler.dart'; |
| 33 import '../serialization/helper.dart'; | 33 import '../serialization/helper.dart'; |
| 34 import '../serialization/model_test_helper.dart'; | 34 import '../serialization/model_test_helper.dart'; |
| 35 import '../equivalence/check_functions.dart'; |
| 36 import 'test_helpers.dart'; |
| 35 | 37 |
| 36 const SOURCE = const { | 38 const SOURCE = const { |
| 37 'main.dart': ''' | 39 'main.dart': ''' |
| 38 abstract class A { | 40 abstract class A { |
| 39 // redirecting factory in abstract class to other class | 41 // redirecting factory in abstract class to other class |
| 40 factory A.a() = D.a; | 42 factory A.a() = D.a; |
| 41 // redirecting factory in abstract class to factory in abstract class | 43 // redirecting factory in abstract class to factory in abstract class |
| 42 factory A.b() = B.a; | 44 factory A.b() = B.a; |
| 43 } | 45 } |
| 44 abstract class B implements A { | 46 abstract class B implements A { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 compiler.reporter, | 102 compiler.reporter, |
| 101 const TreeShakingEnqueuerStrategy(), | 103 const TreeShakingEnqueuerStrategy(), |
| 102 resolutionEnqueuerListener, | 104 resolutionEnqueuerListener, |
| 103 new ElementResolutionWorldBuilder( | 105 new ElementResolutionWorldBuilder( |
| 104 backend, | 106 backend, |
| 105 compiler.resolution, | 107 compiler.resolution, |
| 106 backend.nativeBasicData, | 108 backend.nativeBasicData, |
| 107 backend.nativeDataBuilder, | 109 backend.nativeDataBuilder, |
| 108 interceptorDataBuilder, | 110 interceptorDataBuilder, |
| 109 const OpenWorldStrategy()), | 111 const OpenWorldStrategy()), |
| 110 new KernelWorkItemBuilder(compiler), | 112 new KernelTestWorkItemBuilder(compiler), |
| 111 'enqueuer from kernel'); | 113 'enqueuer from kernel'); |
| 112 ClosedWorld closedWorld = computeClosedWorld( | 114 ClosedWorld closedWorld = computeClosedWorld( |
| 113 compiler.reporter, enqueuer, compiler.elementEnvironment); | 115 compiler.reporter, enqueuer, compiler.elementEnvironment); |
| 114 BackendUsage backendUsage = backendUsageBuilder.close(); | 116 BackendUsage backendUsage = backendUsageBuilder.close(); |
| 115 checkResolutionEnqueuers( | 117 checkResolutionEnqueuers( |
| 116 backendUsage, backendUsage, compiler.enqueuer.resolution, enqueuer, | 118 backendUsage, backendUsage, compiler.enqueuer.resolution, enqueuer, |
| 117 typeEquivalence: (ResolutionDartType a, ResolutionDartType b) { | 119 typeEquivalence: (ResolutionDartType a, ResolutionDartType b) { |
| 118 return areTypesEquivalent(unalias(a), unalias(b)); | 120 return areTypesEquivalent(unalias(a), unalias(b)); |
| 119 }, elementFilter: elementFilter, verbose: arguments.verbose); | 121 }, elementFilter: elementFilter, verbose: arguments.verbose); |
| 120 checkClosedWorlds( | 122 checkClosedWorlds( |
| 121 compiler.resolutionWorldBuilder.closedWorldForTesting, closedWorld, | 123 compiler.resolutionWorldBuilder.closedWorldForTesting, closedWorld, |
| 122 verbose: arguments.verbose); | 124 verbose: arguments.verbose); |
| 123 }); | 125 }); |
| 124 } | 126 } |
| 125 | 127 |
| 126 bool elementFilter(Entity element) { | |
| 127 if (element is ConstructorElement && element.isRedirectingFactory) { | |
| 128 // Redirecting factory constructors are skipped in kernel. | |
| 129 return false; | |
| 130 } | |
| 131 if (element is ClassElement) { | |
| 132 for (ConstructorElement constructor in element.constructors) { | |
| 133 if (!constructor.isRedirectingFactory) { | |
| 134 return true; | |
| 135 } | |
| 136 } | |
| 137 // The class cannot itself be instantiated. | |
| 138 return false; | |
| 139 } | |
| 140 return true; | |
| 141 } | |
| 142 | |
| 143 List createResolutionEnqueuerListener(Compiler compiler) { | 128 List createResolutionEnqueuerListener(Compiler compiler) { |
| 144 JavaScriptBackend backend = compiler.backend; | 129 JavaScriptBackend backend = compiler.backend; |
| 145 BackendUsageBuilder backendUsageBuilder = | 130 BackendUsageBuilder backendUsageBuilder = |
| 146 new BackendUsageBuilderImpl(compiler.commonElements); | 131 new BackendUsageBuilderImpl(compiler.commonElements); |
| 147 InterceptorDataBuilder interceptorDataBuilder = | 132 InterceptorDataBuilder interceptorDataBuilder = |
| 148 new InterceptorDataBuilderImpl(backend.nativeBasicData, | 133 new InterceptorDataBuilderImpl(backend.nativeBasicData, |
| 149 compiler.elementEnvironment, compiler.commonElements); | 134 compiler.elementEnvironment, compiler.commonElements); |
| 150 ResolutionEnqueuerListener listener = new ResolutionEnqueuerListener( | 135 ResolutionEnqueuerListener listener = new ResolutionEnqueuerListener( |
| 151 compiler.options, | 136 compiler.options, |
| 152 compiler.elementEnvironment, | 137 compiler.elementEnvironment, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 171 | 156 |
| 172 ClosedWorld computeClosedWorld(DiagnosticReporter reporter, | 157 ClosedWorld computeClosedWorld(DiagnosticReporter reporter, |
| 173 ResolutionEnqueuer enqueuer, ElementEnvironment elementEnvironment) { | 158 ResolutionEnqueuer enqueuer, ElementEnvironment elementEnvironment) { |
| 174 enqueuer.open(const ImpactStrategy(), elementEnvironment.mainFunction, | 159 enqueuer.open(const ImpactStrategy(), elementEnvironment.mainFunction, |
| 175 elementEnvironment.libraries); | 160 elementEnvironment.libraries); |
| 176 enqueuer.forEach((WorkItem work) { | 161 enqueuer.forEach((WorkItem work) { |
| 177 enqueuer.applyImpact(work.run(), impactSource: work.element); | 162 enqueuer.applyImpact(work.run(), impactSource: work.element); |
| 178 }); | 163 }); |
| 179 return enqueuer.worldBuilder.closeWorld(); | 164 return enqueuer.worldBuilder.closeWorld(); |
| 180 } | 165 } |
| 181 | |
| 182 class KernelWorkItemBuilder implements WorkItemBuilder { | |
| 183 final Compiler _compiler; | |
| 184 | |
| 185 KernelWorkItemBuilder(this._compiler); | |
| 186 | |
| 187 @override | |
| 188 WorkItem createWorkItem(MemberEntity entity) { | |
| 189 return new KernelWorkItem( | |
| 190 _compiler, _compiler.backend.impactTransformer, entity); | |
| 191 } | |
| 192 } | |
| 193 | |
| 194 class KernelWorkItem implements ResolutionWorkItem { | |
| 195 final Compiler _compiler; | |
| 196 final ImpactTransformer _impactTransformer; | |
| 197 final MemberElement element; | |
| 198 | |
| 199 KernelWorkItem(this._compiler, this._impactTransformer, this.element); | |
| 200 | |
| 201 @override | |
| 202 WorldImpact run() { | |
| 203 ResolutionImpact resolutionImpact = build(_compiler, element.resolvedAst); | |
| 204 return _impactTransformer.transformResolutionImpact(resolutionImpact); | |
| 205 } | |
| 206 } | |
| OLD | NEW |