| 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/closure.dart'; | 10 import 'package:compiler/src/closure.dart'; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 entryPoint: entryPoint, | 93 entryPoint: entryPoint, |
| 94 memorySourceFiles: memorySourceFiles, | 94 memorySourceFiles: memorySourceFiles, |
| 95 options: [ | 95 options: [ |
| 96 Flags.analyzeOnly, | 96 Flags.analyzeOnly, |
| 97 Flags.useKernel, | 97 Flags.useKernel, |
| 98 Flags.enableAssertMessage | 98 Flags.enableAssertMessage |
| 99 ]); | 99 ]); |
| 100 ElementResolutionWorldBuilder.useInstantiationMap = true; | 100 ElementResolutionWorldBuilder.useInstantiationMap = true; |
| 101 compiler.resolution.retainCachesForTesting = true; | 101 compiler.resolution.retainCachesForTesting = true; |
| 102 await compiler.run(entryPoint); | 102 await compiler.run(entryPoint); |
| 103 compiler.resolutionWorldBuilder.closeWorld(compiler.reporter); | 103 compiler.resolutionWorldBuilder.closeWorld(); |
| 104 | 104 |
| 105 JavaScriptBackend backend = compiler.backend; | 105 JavaScriptBackend backend = compiler.backend; |
| 106 // Create a new resolution enqueuer and feed it with the [WorldImpact]s | 106 // Create a new resolution enqueuer and feed it with the [WorldImpact]s |
| 107 // computed from kernel through the [build] in `kernel_impact.dart`. | 107 // computed from kernel through the [build] in `kernel_impact.dart`. |
| 108 List list = createResolutionEnqueuerListener(compiler); |
| 109 ResolutionEnqueuerListener resolutionEnqueuerListener = list[0]; |
| 110 BackendUsageBuilder backendUsageBuilder = list[1]; |
| 108 ResolutionEnqueuer enqueuer = new ResolutionEnqueuer( | 111 ResolutionEnqueuer enqueuer = new ResolutionEnqueuer( |
| 109 compiler.enqueuer, | 112 compiler.enqueuer, |
| 110 compiler.options, | 113 compiler.options, |
| 111 compiler.reporter, | 114 compiler.reporter, |
| 112 const TreeShakingEnqueuerStrategy(), | 115 const TreeShakingEnqueuerStrategy(), |
| 113 createResolutionEnqueuerListener(compiler), | 116 resolutionEnqueuerListener, |
| 114 new ElementResolutionWorldBuilder( | 117 new ElementResolutionWorldBuilder( |
| 115 backend, compiler.resolution, const OpenWorldStrategy()), | 118 backend, compiler.resolution, const OpenWorldStrategy()), |
| 116 new KernelWorkItemBuilder(compiler), | 119 new KernelWorkItemBuilder(compiler), |
| 117 'enqueuer from kernel'); | 120 'enqueuer from kernel'); |
| 118 ClosedWorld closedWorld = computeClosedWorld( | 121 ClosedWorld closedWorld = computeClosedWorld( |
| 119 compiler.reporter, enqueuer, compiler.elementEnvironment); | 122 compiler.reporter, enqueuer, compiler.elementEnvironment); |
| 120 BackendUsage backendUsage = compiler.backend.backendUsageBuilder.close(); | 123 BackendUsage backendUsage = backendUsageBuilder.close(); |
| 121 checkResolutionEnqueuers( | 124 checkResolutionEnqueuers( |
| 122 backendUsage, backendUsage, compiler.enqueuer.resolution, enqueuer, | 125 backendUsage, backendUsage, compiler.enqueuer.resolution, enqueuer, |
| 123 typeEquivalence: (ResolutionDartType a, ResolutionDartType b) { | 126 typeEquivalence: (ResolutionDartType a, ResolutionDartType b) { |
| 124 return areTypesEquivalent(unalias(a), unalias(b)); | 127 return areTypesEquivalent(unalias(a), unalias(b)); |
| 125 }, elementFilter: (Element element) { | 128 }, elementFilter: (Element element) { |
| 126 if (element is ConstructorElement && element.isRedirectingFactory) { | 129 if (element is ConstructorElement && element.isRedirectingFactory) { |
| 127 // Redirecting factory constructors are skipped in kernel. | 130 // Redirecting factory constructors are skipped in kernel. |
| 128 return false; | 131 return false; |
| 129 } | 132 } |
| 130 if (element is ClassElement) { | 133 if (element is ClassElement) { |
| 131 for (ConstructorElement constructor in element.constructors) { | 134 for (ConstructorElement constructor in element.constructors) { |
| 132 if (!constructor.isRedirectingFactory) { | 135 if (!constructor.isRedirectingFactory) { |
| 133 return true; | 136 return true; |
| 134 } | 137 } |
| 135 } | 138 } |
| 136 // The class cannot itself be instantiated. | 139 // The class cannot itself be instantiated. |
| 137 return false; | 140 return false; |
| 138 } | 141 } |
| 139 return true; | 142 return true; |
| 140 }, verbose: arguments.verbose); | 143 }, verbose: arguments.verbose); |
| 141 checkClosedWorlds( | 144 checkClosedWorlds( |
| 142 compiler.resolutionWorldBuilder.closedWorldForTesting, closedWorld, | 145 compiler.resolutionWorldBuilder.closedWorldForTesting, closedWorld, |
| 143 verbose: arguments.verbose); | 146 verbose: arguments.verbose); |
| 144 }); | 147 }); |
| 145 } | 148 } |
| 146 | 149 |
| 147 EnqueuerListener createResolutionEnqueuerListener(Compiler compiler) { | 150 List createResolutionEnqueuerListener(Compiler compiler) { |
| 148 JavaScriptBackend backend = compiler.backend; | 151 JavaScriptBackend backend = compiler.backend; |
| 149 return new ResolutionEnqueuerListener( | 152 BackendUsageBuilder backendUsageBuilder = |
| 153 new BackendUsageBuilderImpl(compiler.commonElements); |
| 154 ResolutionEnqueuerListener listener = new ResolutionEnqueuerListener( |
| 150 compiler.options, | 155 compiler.options, |
| 151 compiler.elementEnvironment, | 156 compiler.elementEnvironment, |
| 152 compiler.commonElements, | 157 compiler.commonElements, |
| 153 backend.impacts, | 158 backend.impacts, |
| 154 backend.nativeBasicData, | 159 backend.nativeBasicData, |
| 155 backend.interceptorDataBuilder, | 160 new InterceptorDataBuilderImpl(backend.nativeBasicData, |
| 156 backend.backendUsageBuilder, | 161 compiler.elementEnvironment, compiler.commonElements), |
| 162 backendUsageBuilder, |
| 157 backend.rtiNeedBuilder, | 163 backend.rtiNeedBuilder, |
| 158 backend.mirrorsDataBuilder, | 164 backend.mirrorsDataBuilder, |
| 159 backend.noSuchMethodRegistry, | 165 backend.noSuchMethodRegistry, |
| 160 backend.customElementsResolutionAnalysis, | 166 backend.customElementsResolutionAnalysis, |
| 161 backend.lookupMapResolutionAnalysis, | 167 backend.lookupMapResolutionAnalysis, |
| 162 backend.mirrorsResolutionAnalysis, | 168 backend.mirrorsResolutionAnalysis, |
| 163 new TypeVariableResolutionAnalysis(compiler.elementEnvironment, | 169 new TypeVariableResolutionAnalysis( |
| 164 backend.impacts, backend.backendUsageBuilder), | 170 compiler.elementEnvironment, backend.impacts, backendUsageBuilder), |
| 165 backend.nativeResolutionEnqueuer, | 171 backend.nativeResolutionEnqueuer, |
| 166 compiler.deferredLoadTask, | 172 compiler.deferredLoadTask, |
| 167 backend.kernelTask); | 173 backend.kernelTask); |
| 174 return [listener, backendUsageBuilder]; |
| 168 } | 175 } |
| 169 | 176 |
| 170 ClosedWorld computeClosedWorld(DiagnosticReporter reporter, | 177 ClosedWorld computeClosedWorld(DiagnosticReporter reporter, |
| 171 ResolutionEnqueuer enqueuer, ElementEnvironment elementEnvironment) { | 178 ResolutionEnqueuer enqueuer, ElementEnvironment elementEnvironment) { |
| 172 enqueuer.open(const ImpactStrategy(), elementEnvironment.mainFunction, | 179 enqueuer.open(const ImpactStrategy(), elementEnvironment.mainFunction, |
| 173 elementEnvironment.libraries); | 180 elementEnvironment.libraries); |
| 174 enqueuer.forEach((WorkItem work) { | 181 enqueuer.forEach((WorkItem work) { |
| 175 enqueuer.applyImpact(work.run(), impactSource: work.element); | 182 enqueuer.applyImpact(work.run(), impactSource: work.element); |
| 176 }); | 183 }); |
| 177 return enqueuer.worldBuilder.closeWorld(reporter); | 184 return enqueuer.worldBuilder.closeWorld(); |
| 178 } | 185 } |
| 179 | 186 |
| 180 class KernelWorkItemBuilder implements WorkItemBuilder { | 187 class KernelWorkItemBuilder implements WorkItemBuilder { |
| 181 final Compiler _compiler; | 188 final Compiler _compiler; |
| 182 | 189 |
| 183 KernelWorkItemBuilder(this._compiler); | 190 KernelWorkItemBuilder(this._compiler); |
| 184 | 191 |
| 185 @override | 192 @override |
| 186 WorkItem createWorkItem(MemberEntity entity) { | 193 WorkItem createWorkItem(MemberEntity entity) { |
| 187 return new KernelWorkItem( | 194 return new KernelWorkItem( |
| 188 _compiler, _compiler.backend.impactTransformer, entity); | 195 _compiler, _compiler.backend.impactTransformer, entity); |
| 189 } | 196 } |
| 190 } | 197 } |
| 191 | 198 |
| 192 class KernelWorkItem implements ResolutionWorkItem { | 199 class KernelWorkItem implements ResolutionWorkItem { |
| 193 final Compiler _compiler; | 200 final Compiler _compiler; |
| 194 final ImpactTransformer _impactTransformer; | 201 final ImpactTransformer _impactTransformer; |
| 195 final MemberElement element; | 202 final MemberElement element; |
| 196 | 203 |
| 197 KernelWorkItem(this._compiler, this._impactTransformer, this.element); | 204 KernelWorkItem(this._compiler, this._impactTransformer, this.element); |
| 198 | 205 |
| 199 @override | 206 @override |
| 200 WorldImpact run() { | 207 WorldImpact run() { |
| 201 ResolutionImpact resolutionImpact = build(_compiler, element.resolvedAst); | 208 ResolutionImpact resolutionImpact = build(_compiler, element.resolvedAst); |
| 202 return _impactTransformer.transformResolutionImpact(resolutionImpact); | 209 return _impactTransformer.transformResolutionImpact(resolutionImpact); |
| 203 } | 210 } |
| 204 } | 211 } |
| OLD | NEW |