| 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 // Partial test that the closed world computed from [WorldImpact]s derived from | 5 // Partial test that the closed world computed from [WorldImpact]s derived from |
| 6 // kernel is equivalent to the original computed from resolution. | 6 // kernel is equivalent to the original computed from resolution. |
| 7 library dart2js.kernel.closed_world2_test; | 7 library dart2js.kernel.closed_world2_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'; |
| 11 import 'package:compiler/src/commandline_options.dart'; | 11 import 'package:compiler/src/commandline_options.dart'; |
| 12 import 'package:compiler/src/common.dart'; | 12 import 'package:compiler/src/common.dart'; |
| 13 import 'package:compiler/src/common_elements.dart'; | 13 import 'package:compiler/src/common_elements.dart'; |
| 14 import 'package:compiler/src/common/backend_api.dart'; | 14 import 'package:compiler/src/common/backend_api.dart'; |
| 15 import 'package:compiler/src/common/resolution.dart'; | 15 import 'package:compiler/src/common/resolution.dart'; |
| 16 import 'package:compiler/src/common/work.dart'; | 16 import 'package:compiler/src/common/work.dart'; |
| 17 import 'package:compiler/src/compiler.dart'; | 17 import 'package:compiler/src/compiler.dart'; |
| 18 import 'package:compiler/src/deferred_load.dart'; | 18 import 'package:compiler/src/deferred_load.dart'; |
| 19 import 'package:compiler/src/elements/resolution_types.dart'; | 19 import 'package:compiler/src/elements/resolution_types.dart'; |
| 20 import 'package:compiler/src/elements/elements.dart'; | 20 import 'package:compiler/src/elements/elements.dart'; |
| 21 import 'package:compiler/src/elements/entities.dart'; | 21 import 'package:compiler/src/elements/entities.dart'; |
| 22 import 'package:compiler/src/elements/types.dart'; | 22 import 'package:compiler/src/elements/types.dart'; |
| 23 import 'package:compiler/src/enqueue.dart'; | 23 import 'package:compiler/src/enqueue.dart'; |
| 24 import 'package:compiler/src/js_backend/backend.dart'; | 24 import 'package:compiler/src/js_backend/backend.dart' |
| 25 hide RuntimeTypesNeedBuilderImpl; |
| 25 import 'package:compiler/src/js_backend/backend_impact.dart'; | 26 import 'package:compiler/src/js_backend/backend_impact.dart'; |
| 26 import 'package:compiler/src/js_backend/backend_usage.dart'; | 27 import 'package:compiler/src/js_backend/backend_usage.dart'; |
| 27 import 'package:compiler/src/js_backend/custom_elements_analysis.dart'; | 28 import 'package:compiler/src/js_backend/custom_elements_analysis.dart'; |
| 28 import 'package:compiler/src/js_backend/native_data.dart'; | 29 import 'package:compiler/src/js_backend/native_data.dart'; |
| 29 import 'package:compiler/src/js_backend/impact_transformer.dart'; | 30 import 'package:compiler/src/js_backend/impact_transformer.dart'; |
| 30 import 'package:compiler/src/js_backend/interceptor_data.dart'; | 31 import 'package:compiler/src/js_backend/interceptor_data.dart'; |
| 31 import 'package:compiler/src/js_backend/lookup_map_analysis.dart'; | 32 import 'package:compiler/src/js_backend/lookup_map_analysis.dart'; |
| 32 import 'package:compiler/src/js_backend/mirrors_analysis.dart'; | 33 import 'package:compiler/src/js_backend/mirrors_analysis.dart' |
| 34 hide MirrorsResolutionAnalysisImpl; |
| 33 import 'package:compiler/src/js_backend/mirrors_data.dart'; | 35 import 'package:compiler/src/js_backend/mirrors_data.dart'; |
| 34 import 'package:compiler/src/js_backend/no_such_method_registry.dart'; | 36 import 'package:compiler/src/js_backend/no_such_method_registry.dart'; |
| 35 import 'package:compiler/src/js_backend/resolution_listener.dart'; | 37 import 'package:compiler/src/js_backend/resolution_listener.dart'; |
| 36 import 'package:compiler/src/js_backend/type_variable_handler.dart'; | 38 import 'package:compiler/src/js_backend/type_variable_handler.dart'; |
| 37 import 'package:compiler/src/native/enqueue.dart'; | 39 import 'package:compiler/src/native/enqueue.dart'; |
| 38 import 'package:compiler/src/native/resolver.dart'; | 40 import 'package:compiler/src/native/resolver.dart'; |
| 39 import 'package:compiler/src/kernel/element_map.dart'; | 41 import 'package:compiler/src/kernel/element_map.dart'; |
| 42 import 'package:compiler/src/kernel/kernel_strategy.dart'; |
| 40 import 'package:compiler/src/options.dart'; | 43 import 'package:compiler/src/options.dart'; |
| 41 import 'package:compiler/src/universe/world_builder.dart'; | 44 import 'package:compiler/src/universe/world_builder.dart'; |
| 42 import 'package:compiler/src/universe/world_impact.dart'; | 45 import 'package:compiler/src/universe/world_impact.dart'; |
| 43 import 'package:compiler/src/world.dart'; | 46 import 'package:compiler/src/world.dart'; |
| 44 import 'package:expect/expect.dart'; | 47 import 'package:expect/expect.dart'; |
| 45 import '../memory_compiler.dart'; | 48 import '../memory_compiler.dart'; |
| 46 import '../serialization/helper.dart'; | 49 import '../serialization/helper.dart'; |
| 47 import '../serialization/model_test_helper.dart'; | 50 import '../serialization/model_test_helper.dart'; |
| 48 import '../serialization/test_helper.dart'; | 51 import '../serialization/test_helper.dart'; |
| 49 | 52 |
| 50 import 'closed_world_test.dart'; | 53 import 'closed_world_test.dart' hide KernelWorkItemBuilder; |
| 51 import 'impact_test.dart'; | 54 import 'impact_test.dart'; |
| 52 | 55 |
| 53 const SOURCE = const { | 56 const SOURCE = const { |
| 54 'main.dart': ''' | 57 'main.dart': ''' |
| 55 import 'dart:html'; | 58 import 'dart:html'; |
| 56 | 59 |
| 57 main() { | 60 main() { |
| 58 print('Hello World'); | 61 print('Hello World'); |
| 59 ''.contains; // Trigger member closurization. | 62 ''.contains; // Trigger member closurization. |
| 60 new Element.div(); | 63 new Element.div(); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 CommonElements commonElements = elementMap.commonElements; | 158 CommonElements commonElements = elementMap.commonElements; |
| 156 BackendImpacts impacts = new BackendImpacts(options, commonElements); | 159 BackendImpacts impacts = new BackendImpacts(options, commonElements); |
| 157 | 160 |
| 158 // TODO(johnniwinther): Create Kernel based implementations for these: | 161 // TODO(johnniwinther): Create Kernel based implementations for these: |
| 159 RuntimeTypesNeedBuilder rtiNeedBuilder = new RuntimeTypesNeedBuilderImpl(); | 162 RuntimeTypesNeedBuilder rtiNeedBuilder = new RuntimeTypesNeedBuilderImpl(); |
| 160 MirrorsDataBuilder mirrorsDataBuilder = new MirrorsDataBuilderImpl(); | 163 MirrorsDataBuilder mirrorsDataBuilder = new MirrorsDataBuilderImpl(); |
| 161 CustomElementsResolutionAnalysis customElementsResolutionAnalysis = | 164 CustomElementsResolutionAnalysis customElementsResolutionAnalysis = |
| 162 new CustomElementsResolutionAnalysisImpl(); | 165 new CustomElementsResolutionAnalysisImpl(); |
| 163 MirrorsResolutionAnalysis mirrorsResolutionAnalysis = | 166 MirrorsResolutionAnalysis mirrorsResolutionAnalysis = |
| 164 new MirrorsResolutionAnalysisImpl(); | 167 new MirrorsResolutionAnalysisImpl(); |
| 168 |
| 165 LookupMapResolutionAnalysis lookupMapResolutionAnalysis = | 169 LookupMapResolutionAnalysis lookupMapResolutionAnalysis = |
| 166 new LookupMapResolutionAnalysis(reporter, elementEnvironment); | 170 new LookupMapResolutionAnalysis(reporter, elementEnvironment); |
| 167 | |
| 168 InterceptorDataBuilder interceptorDataBuilder = | 171 InterceptorDataBuilder interceptorDataBuilder = |
| 169 new InterceptorDataBuilderImpl( | 172 new InterceptorDataBuilderImpl( |
| 170 nativeBasicData, elementEnvironment, commonElements); | 173 nativeBasicData, elementEnvironment, commonElements); |
| 171 BackendUsageBuilder backendUsageBuilder = | 174 BackendUsageBuilder backendUsageBuilder = |
| 172 new BackendUsageBuilderImpl(commonElements); | 175 new BackendUsageBuilderImpl(commonElements); |
| 173 NoSuchMethodRegistry noSuchMethodRegistry = new NoSuchMethodRegistry( | 176 NoSuchMethodRegistry noSuchMethodRegistry = new NoSuchMethodRegistry( |
| 174 commonElements, new KernelNoSuchMethodResolver(elementMap)); | 177 commonElements, new KernelNoSuchMethodResolver(elementMap)); |
| 175 NativeClassResolver nativeClassResolver = new NativeClassResolverImpl( | 178 NativeClassResolver nativeClassResolver = new NativeClassResolverImpl( |
| 176 elementEnvironment, commonElements, nativeBasicData); | 179 elementEnvironment, commonElements, nativeBasicData); |
| 177 NativeResolutionEnqueuer nativeResolutionEnqueuer = | 180 NativeResolutionEnqueuer nativeResolutionEnqueuer = |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 ElementEnvironment elementEnvironment = elementMap.elementEnvironment; | 221 ElementEnvironment elementEnvironment = elementMap.elementEnvironment; |
| 219 for (LibraryEntity library in elementEnvironment.libraries) { | 222 for (LibraryEntity library in elementEnvironment.libraries) { |
| 220 if (library.canonicalUri.scheme == 'dart') { | 223 if (library.canonicalUri.scheme == 'dart') { |
| 221 new KernelAnnotationProcessor(elementMap) | 224 new KernelAnnotationProcessor(elementMap) |
| 222 .extractNativeAnnotations(library, builder); | 225 .extractNativeAnnotations(library, builder); |
| 223 } | 226 } |
| 224 } | 227 } |
| 225 return builder.close(elementEnvironment); | 228 return builder.close(elementEnvironment); |
| 226 } | 229 } |
| 227 | 230 |
| 228 class RuntimeTypesNeedBuilderImpl implements RuntimeTypesNeedBuilder { | |
| 229 @override | |
| 230 void registerClassUsingTypeVariableExpression(ClassEntity cls) {} | |
| 231 | |
| 232 @override | |
| 233 RuntimeTypesNeed computeRuntimeTypesNeed( | |
| 234 ResolutionWorldBuilder resolutionWorldBuilder, | |
| 235 ClosedWorld closedWorld, | |
| 236 DartTypes types, | |
| 237 CommonElements commonElements, | |
| 238 BackendUsage backendUsage, | |
| 239 {bool enableTypeAssertions}) { | |
| 240 throw new UnimplementedError( | |
| 241 'RuntimeTypesNeedBuilderImpl.computeRuntimeTypesNeed'); | |
| 242 } | |
| 243 | |
| 244 @override | |
| 245 void registerRtiDependency(ClassEntity element, ClassEntity dependency) {} | |
| 246 } | |
| 247 | |
| 248 class MirrorsDataBuilderImpl implements MirrorsDataBuilder { | |
| 249 @override | |
| 250 void registerUsedMember(MemberEntity member) {} | |
| 251 | |
| 252 @override | |
| 253 void computeMembersNeededForReflection( | |
| 254 ResolutionWorldBuilder worldBuilder, ClosedWorld closedWorld) {} | |
| 255 | |
| 256 @override | |
| 257 void maybeMarkClosureAsNeededForReflection( | |
| 258 ClosureClassElement globalizedElement, | |
| 259 FunctionElement callFunction, | |
| 260 FunctionElement function) {} | |
| 261 | |
| 262 @override | |
| 263 void registerConstSymbol(String name) {} | |
| 264 | |
| 265 @override | |
| 266 void registerMirrorUsage( | |
| 267 Set<String> symbols, Set<Element> targets, Set<Element> metaTargets) {} | |
| 268 } | |
| 269 | |
| 270 class CustomElementsResolutionAnalysisImpl | |
| 271 implements CustomElementsResolutionAnalysis { | |
| 272 @override | |
| 273 CustomElementsAnalysisJoin get join { | |
| 274 throw new UnimplementedError('CustomElementsResolutionAnalysisImpl.join'); | |
| 275 } | |
| 276 | |
| 277 @override | |
| 278 WorldImpact flush() { | |
| 279 // TODO(johnniwinther): Implement this. | |
| 280 return const WorldImpact(); | |
| 281 } | |
| 282 | |
| 283 @override | |
| 284 void registerStaticUse(MemberEntity element) {} | |
| 285 | |
| 286 @override | |
| 287 void registerInstantiatedClass(ClassEntity classElement) {} | |
| 288 | |
| 289 @override | |
| 290 void registerTypeLiteral(DartType type) {} | |
| 291 } | |
| 292 | |
| 293 class MirrorsResolutionAnalysisImpl implements MirrorsResolutionAnalysis { | |
| 294 @override | |
| 295 void onQueueEmpty(Enqueuer enqueuer, Iterable<ClassEntity> recentClasses) {} | |
| 296 | |
| 297 @override | |
| 298 MirrorsCodegenAnalysis close() { | |
| 299 throw new UnimplementedError('MirrorsResolutionAnalysisImpl.close'); | |
| 300 } | |
| 301 | |
| 302 @override | |
| 303 void onResolutionComplete() {} | |
| 304 } | |
| 305 | |
| 306 class KernelWorkItemBuilder implements WorkItemBuilder { | |
| 307 final KernelToElementMap _worldBuilder; | |
| 308 final ImpactTransformer _impactTransformer; | |
| 309 | |
| 310 KernelWorkItemBuilder(this._worldBuilder, this._impactTransformer); | |
| 311 | |
| 312 @override | |
| 313 WorkItem createWorkItem(MemberEntity entity) { | |
| 314 return new KernelWorkItem(_worldBuilder, _impactTransformer, entity); | |
| 315 } | |
| 316 } | |
| 317 | |
| 318 class KernelWorkItem implements ResolutionWorkItem { | |
| 319 final KernelToElementMap _worldBuilder; | |
| 320 final ImpactTransformer _impactTransformer; | |
| 321 final MemberEntity element; | |
| 322 | |
| 323 KernelWorkItem(this._worldBuilder, this._impactTransformer, this.element); | |
| 324 | |
| 325 @override | |
| 326 WorldImpact run() { | |
| 327 ResolutionImpact impact = _worldBuilder.computeWorldImpact(element); | |
| 328 return _impactTransformer.transformResolutionImpact(impact); | |
| 329 } | |
| 330 } | |
| 331 | |
| 332 void checkNativeBasicData(NativeBasicDataImpl data1, NativeBasicDataImpl data2, | 231 void checkNativeBasicData(NativeBasicDataImpl data1, NativeBasicDataImpl data2, |
| 333 KernelEquivalence equivalence) { | 232 KernelEquivalence equivalence) { |
| 334 checkMapEquivalence( | 233 checkMapEquivalence( |
| 335 data1, | 234 data1, |
| 336 data2, | 235 data2, |
| 337 'nativeClassTagInfo', | 236 'nativeClassTagInfo', |
| 338 data1.nativeClassTagInfo, | 237 data1.nativeClassTagInfo, |
| 339 data2.nativeClassTagInfo, | 238 data2.nativeClassTagInfo, |
| 340 equivalence.entityEquivalence, | 239 equivalence.entityEquivalence, |
| 341 (a, b) => a == b); | 240 (a, b) => a == b); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 usage2.isInvokeOnUsed); | 289 usage2.isInvokeOnUsed); |
| 391 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, | 290 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, |
| 392 usage2.isRuntimeTypeUsed); | 291 usage2.isRuntimeTypeUsed); |
| 393 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, | 292 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, |
| 394 usage2.isIsolateInUse); | 293 usage2.isIsolateInUse); |
| 395 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, | 294 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, |
| 396 usage2.isFunctionApplyUsed); | 295 usage2.isFunctionApplyUsed); |
| 397 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, | 296 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, |
| 398 usage2.isNoSuchMethodUsed); | 297 usage2.isNoSuchMethodUsed); |
| 399 } | 298 } |
| OLD | NEW |