Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Unified Diff: tests/compiler/dart2js/kernel/closed_world2_test.dart

Issue 2810633003: Add kernel/closed_world2_test (Closed)
Patch Set: Add TODOs. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tests/compiler/dart2js/kernel/closed_world2_test.dart
diff --git a/tests/compiler/dart2js/kernel/closed_world2_test.dart b/tests/compiler/dart2js/kernel/closed_world2_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..d1d45241e32f9356de297609aab24bf57df6ba7f
--- /dev/null
+++ b/tests/compiler/dart2js/kernel/closed_world2_test.dart
@@ -0,0 +1,328 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Partial test that the closed world computed from [WorldImpact]s derived from
+// kernel is equivalent to the original computed from resolution.
+library dart2js.kernel.closed_world2_test;
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/common/backend_api.dart';
+import 'package:compiler/src/common/resolution.dart';
+import 'package:compiler/src/common/work.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/deferred_load.dart';
+import 'package:compiler/src/elements/resolution_types.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/types.dart';
+import 'package:compiler/src/enqueue.dart';
+import 'package:compiler/src/js_backend/backend.dart';
+import 'package:compiler/src/js_backend/backend_helpers.dart';
+import 'package:compiler/src/js_backend/backend_impact.dart';
+import 'package:compiler/src/js_backend/backend_usage.dart';
+import 'package:compiler/src/js_backend/custom_elements_analysis.dart';
+import 'package:compiler/src/js_backend/native_data.dart';
+import 'package:compiler/src/js_backend/impact_transformer.dart';
+import 'package:compiler/src/js_backend/interceptor_data.dart';
+import 'package:compiler/src/js_backend/lookup_map_analysis.dart';
+import 'package:compiler/src/js_backend/mirrors_analysis.dart';
+import 'package:compiler/src/js_backend/mirrors_data.dart';
+import 'package:compiler/src/js_backend/no_such_method_registry.dart';
+import 'package:compiler/src/js_backend/resolution_listener.dart';
+import 'package:compiler/src/js_backend/type_variable_handler.dart';
+import 'package:compiler/src/native/enqueue.dart';
+import 'package:compiler/src/kernel/world_builder.dart';
+import 'package:compiler/src/options.dart';
+import 'package:compiler/src/universe/world_builder.dart';
+import 'package:compiler/src/universe/world_impact.dart';
+import 'package:compiler/src/world.dart';
+import '../memory_compiler.dart';
+import '../serialization/helper.dart';
+
+import 'closed_world_test.dart';
+
+main(List<String> args) {
+ Arguments arguments = new Arguments.from(args);
+ Uri entryPoint;
+ Map<String, String> memorySourceFiles;
+ if (arguments.uri != null) {
+ entryPoint = arguments.uri;
+ memorySourceFiles = const <String, String>{};
+ } else {
+ entryPoint = Uri.parse('memory:main.dart');
+ memorySourceFiles = SOURCE;
+ }
+
+ asyncTest(() async {
+ enableDebugMode();
+ Compiler compiler = compilerFor(
+ entryPoint: entryPoint,
+ memorySourceFiles: memorySourceFiles,
+ options: [
+ Flags.analyzeAll,
+ Flags.useKernel,
+ Flags.enableAssertMessage
+ ]);
+ ElementResolutionWorldBuilder.useInstantiationMap = true;
+ compiler.resolution.retainCachesForTesting = true;
+ await compiler.run(entryPoint);
+ compiler.resolutionWorldBuilder.closeWorld(compiler.reporter);
+
+ KernelWorldBuilder worldBuilder = new KernelWorldBuilder(
+ compiler.reporter, compiler.backend.kernelTask.program);
+ List list = createKernelResolutionEnqueuerListener(
+ compiler.options, compiler.deferredLoadTask, worldBuilder);
+ ResolutionEnqueuerListener resolutionEnqueuerListener = list[0];
+ ImpactTransformer impactTransformer = list[1];
+ ResolutionEnqueuer enqueuer = new ResolutionEnqueuer(
+ compiler.enqueuer,
+ compiler.options,
+ compiler.reporter,
+ const TreeShakingEnqueuerStrategy(),
+ resolutionEnqueuerListener,
+ new KernelResolutionWorldBuilder(
+ worldBuilder.elementEnvironment,
+ worldBuilder.commonElements,
+ new NativeBasicDataImpl(),
+ const OpenWorldStrategy()),
+ new KernelWorkItemBuilder(worldBuilder, impactTransformer),
+ 'enqueuer from kelements');
+
+ computeClosedWorld(
+ compiler.reporter, enqueuer, worldBuilder.elementEnvironment);
+ });
+}
+
+List createKernelResolutionEnqueuerListener(CompilerOptions options,
+ DeferredLoadTask deferredLoadTask, KernelWorldBuilder worldBuilder) {
+ ElementEnvironment elementEnvironment = worldBuilder.elementEnvironment;
+ CommonElements commonElements = worldBuilder.commonElements;
+ BackendHelpers helpers =
+ new BackendHelpers(elementEnvironment, commonElements);
+ BackendImpacts impacts = new BackendImpacts(options, commonElements, helpers);
+
+ // TODO(johnniwinther): Create Kernel based implementations for these:
+ NativeBasicData nativeBasicData = new NativeBasicDataImpl();
+ RuntimeTypesNeedBuilder rtiNeedBuilder = new RuntimeTypesNeedBuilderImpl();
+ MirrorsDataBuilder mirrorsDataBuilder = new MirrorsDataBuilderImpl();
+ CustomElementsResolutionAnalysis customElementsResolutionAnalysis =
+ new CustomElementsResolutionAnalysisImpl();
+ LookupMapResolutionAnalysis lookupMapResolutionAnalysis =
+ new LookupMapResolutionAnalysisImpl();
+ MirrorsResolutionAnalysis mirrorsResolutionAnalysis =
+ new MirrorsResolutionAnalysisImpl();
+
+ BackendClasses backendClasses = new JavaScriptBackendClasses(
+ elementEnvironment, helpers, nativeBasicData);
+ InterceptorDataBuilder interceptorDataBuilder =
+ new InterceptorDataBuilderImpl(
+ nativeBasicData, helpers, elementEnvironment, commonElements);
+ BackendUsageBuilder backendUsageBuilder =
+ new BackendUsageBuilderImpl(commonElements, helpers);
+ NoSuchMethodRegistry noSuchMethodRegistry = new NoSuchMethodRegistry(
+ helpers, new KernelNoSuchMethodResolver(worldBuilder));
+ NativeResolutionEnqueuer nativeResolutionEnqueuer =
+ new NativeResolutionEnqueuer(
+ options,
+ elementEnvironment,
+ commonElements,
+ helpers,
+ backendClasses,
+ backendUsageBuilder,
+ new KernelNativeClassResolver(worldBuilder));
+
+ ResolutionEnqueuerListener listener = new ResolutionEnqueuerListener(
+ options,
+ elementEnvironment,
+ commonElements,
+ helpers,
+ impacts,
+ backendClasses,
+ nativeBasicData,
+ interceptorDataBuilder,
+ backendUsageBuilder,
+ rtiNeedBuilder,
+ mirrorsDataBuilder,
+ noSuchMethodRegistry,
+ customElementsResolutionAnalysis,
+ lookupMapResolutionAnalysis,
+ mirrorsResolutionAnalysis,
+ new TypeVariableResolutionAnalysis(
+ elementEnvironment, impacts, backendUsageBuilder),
+ nativeResolutionEnqueuer,
+ deferredLoadTask);
+
+ ImpactTransformer transformer = new JavaScriptImpactTransformer(
+ options,
+ elementEnvironment,
+ commonElements,
+ impacts,
+ nativeBasicData,
+ nativeResolutionEnqueuer,
+ backendUsageBuilder,
+ mirrorsDataBuilder,
+ customElementsResolutionAnalysis,
+ rtiNeedBuilder);
+ return [listener, transformer];
+}
+
+class NativeBasicDataImpl implements NativeBasicData {
+ @override
+ bool isNativeClass(ClassEntity element) {
+ // TODO(johnniwinther): Implement this.
+ return false;
+ }
+
+ @override
+ bool isJsInteropClass(ClassEntity element) {
+ throw new UnimplementedError('NativeBasicDataImpl.isJsInteropClass');
+ }
+
+ @override
+ bool isJsInteropLibrary(LibraryEntity element) {
+ throw new UnimplementedError('NativeBasicDataImpl.isJsInteropLibrary');
+ }
+
+ @override
+ bool isNativeOrExtendsNative(ClassEntity element) {
+ // TODO(johnniwinther): Implement this.
+ return false;
+ }
+
+ @override
+ bool hasNativeTagsForcedNonLeaf(ClassEntity cls) {
+ throw new UnimplementedError(
+ 'NativeBasicDataImpl.hasNativeTagsForcedNonLeaf');
+ }
+
+ @override
+ List<String> getNativeTagsOfClass(ClassEntity cls) {
+ throw new UnimplementedError('NativeBasicDataImpl.getNativeTagsOfClass');
+ }
+}
+
+class RuntimeTypesNeedBuilderImpl implements RuntimeTypesNeedBuilder {
+ @override
+ void registerClassUsingTypeVariableExpression(ClassEntity cls) {}
+
+ @override
+ RuntimeTypesNeed computeRuntimeTypesNeed(
+ ResolutionWorldBuilder resolutionWorldBuilder,
+ ClosedWorld closedWorld,
+ DartTypes types,
+ CommonElements commonElements,
+ BackendHelpers helpers,
+ BackendUsage backendUsage,
+ {bool enableTypeAssertions}) {
+ throw new UnimplementedError(
+ 'RuntimeTypesNeedBuilderImpl.computeRuntimeTypesNeed');
+ }
+
+ @override
+ void registerRtiDependency(ClassEntity element, ClassEntity dependency) {}
+}
+
+class MirrorsDataBuilderImpl implements MirrorsDataBuilder {
+ @override
+ void registerUsedMember(MemberEntity member) {}
+
+ @override
+ void computeMembersNeededForReflection(
+ ResolutionWorldBuilder worldBuilder, ClosedWorld closedWorld) {}
+
+ @override
+ void maybeMarkClosureAsNeededForReflection(
+ ClosureClassElement globalizedElement,
+ FunctionElement callFunction,
+ FunctionElement function) {}
+
+ @override
+ void registerConstSymbol(String name) {}
+
+ @override
+ void registerMirrorUsage(
+ Set<String> symbols, Set<Element> targets, Set<Element> metaTargets) {}
+}
+
+class CustomElementsResolutionAnalysisImpl
+ implements CustomElementsResolutionAnalysis {
+ @override
+ CustomElementsAnalysisJoin get join {
+ throw new UnimplementedError('CustomElementsResolutionAnalysisImpl.join');
+ }
+
+ @override
+ WorldImpact flush() {
+ // TODO(johnniwinther): Implement this.
+ return const WorldImpact();
+ }
+
+ @override
+ void registerStaticUse(MemberEntity element) {}
+
+ @override
+ void registerInstantiatedClass(ClassEntity classElement) {}
+
+ @override
+ void registerTypeLiteral(DartType type) {}
+}
+
+class LookupMapResolutionAnalysisImpl implements LookupMapResolutionAnalysis {
+ @override
+ FieldEntity lookupMapVersionVariable;
+ @override
+ LibraryEntity lookupMapLibrary;
+
+ @override
+ WorldImpact flush() {
+ // TODO(johnniwinther): Implement this.
+ return const WorldImpact();
+ }
+
+ @override
+ void init(LibraryEntity library) {}
+}
+
+class MirrorsResolutionAnalysisImpl implements MirrorsResolutionAnalysis {
+ @override
+ void onQueueEmpty(Enqueuer enqueuer, Iterable<ClassEntity> recentClasses) {}
+
+ @override
+ MirrorsCodegenAnalysis close() {
+ throw new UnimplementedError('MirrorsResolutionAnalysisImpl.close');
+ }
+
+ @override
+ void onResolutionComplete() {}
+}
+
+class KernelWorkItemBuilder implements WorkItemBuilder {
+ final KernelWorldBuilder _worldBuilder;
+ final ImpactTransformer _impactTransformer;
+
+ KernelWorkItemBuilder(this._worldBuilder, this._impactTransformer);
+
+ @override
+ WorkItem createWorkItem(MemberEntity entity) {
+ return new KernelWorkItem(_worldBuilder, _impactTransformer, entity);
+ }
+}
+
+class KernelWorkItem implements ResolutionWorkItem {
+ final KernelWorldBuilder _worldBuilder;
+ final ImpactTransformer _impactTransformer;
+ final MemberEntity element;
+
+ KernelWorkItem(this._worldBuilder, this._impactTransformer, this.element);
+
+ @override
+ WorldImpact run() {
+ ResolutionImpact impact = _worldBuilder.computeWorldImpact(element);
+ return _impactTransformer.transformResolutionImpact(impact);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698