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