| Index: tests/compiler/dart2js/kernel/closed_world_test.dart
|
| diff --git a/tests/compiler/dart2js/kernel/closed_world_test.dart b/tests/compiler/dart2js/kernel/closed_world_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d277221884c58c370bc5415924e6a097e5979e8a
|
| --- /dev/null
|
| +++ b/tests/compiler/dart2js/kernel/closed_world_test.dart
|
| @@ -0,0 +1,114 @@
|
| +// 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.
|
| +
|
| +// Tests that the closed world computed from [WorldImpact]s derived from kernel
|
| +// is equivalent to the original computed from resolution.
|
| +library dart2js.kernel.closed_world_test;
|
| +
|
| +import 'package:async_helper/async_helper.dart';
|
| +import 'package:compiler/src/commandline_options.dart';
|
| +import 'package:compiler/src/common.dart';
|
| +import 'package:compiler/src/common/names.dart';
|
| +import 'package:compiler/src/common/resolution.dart';
|
| +import 'package:compiler/src/compiler.dart';
|
| +import 'package:compiler/src/constants/expressions.dart';
|
| +import 'package:compiler/src/dart_types.dart';
|
| +import 'package:compiler/src/elements/elements.dart';
|
| +import 'package:compiler/src/enqueue.dart';
|
| +import 'package:compiler/src/js_backend/backend.dart';
|
| +import 'package:compiler/src/js_backend/type_variable_handler.dart';
|
| +import 'package:compiler/src/resolution/registry.dart';
|
| +import 'package:compiler/src/resolution/tree_elements.dart';
|
| +import 'package:compiler/src/ssa/kernel_impact.dart';
|
| +import 'package:compiler/src/serialization/equivalence.dart';
|
| +import 'package:compiler/src/universe/call_structure.dart';
|
| +import 'package:compiler/src/universe/feature.dart';
|
| +import 'package:compiler/src/universe/world_impact.dart';
|
| +import 'package:compiler/src/world.dart';
|
| +import 'package:expect/expect.dart';
|
| +import 'impact_test.dart';
|
| +import '../memory_compiler.dart';
|
| +import '../serialization/helper.dart';
|
| +import '../serialization/model_test_helper.dart';
|
| +
|
| +const SOURCE = const {
|
| + 'main.dart': '''
|
| +main() {
|
| + print('Hello World!');
|
| +}
|
| +'''
|
| +};
|
| +
|
| +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.analyzeOnly,
|
| + Flags.useKernel,
|
| + Flags.enableAssertMessage
|
| + ]);
|
| + compiler.resolution.retainCachesForTesting = true;
|
| + await compiler.run(entryPoint);
|
| + compiler.openWorld.closeWorld(compiler.reporter);
|
| +
|
| + JavaScriptBackend backend = compiler.backend;
|
| + // Create a new resolution enqueuer and feed it with the [WorldImpact]s
|
| + // computed from kernel through the [build] in `kernel_impact.dart`.
|
| + ResolutionEnqueuer enqueuer = new ResolutionEnqueuer(
|
| + compiler.enqueuer,
|
| + compiler.options,
|
| + compiler.resolution,
|
| + compiler.enqueuerFilter,
|
| + const TreeShakingEnqueuerStrategy(),
|
| + compiler.globalDependencies,
|
| + backend,
|
| + compiler.commonElements,
|
| + compiler.cacheStrategy);
|
| + // TODO(johnniwinther): Store backend info separately. This replacement is
|
| + // made to reset a field in [TypeVariableHandler] that prevents it from
|
| + // enqueuing twice.
|
| + backend.typeVariableHandler = new TypeVariableHandler(compiler);
|
| +
|
| + backend.enqueueHelpers(enqueuer);
|
| + enqueuer.addToWorkList(compiler.mainFunction);
|
| + enqueuer.forEach((work) {
|
| + AstElement element = work.element;
|
| + ResolutionImpact resolutionImpact = build(compiler, element.resolvedAst);
|
| + WorldImpact worldImpact = compiler.backend.impactTransformer
|
| + .transformResolutionImpact(enqueuer, resolutionImpact);
|
| + enqueuer.registerProcessedElement(element);
|
| + enqueuer.applyImpact(compiler.impactStrategy, worldImpact,
|
| + impactSource: element);
|
| + });
|
| + ClosedWorld closedWorld =
|
| + enqueuer.universe.openWorld.closeWorld(compiler.reporter);
|
| +
|
| + checkResolutionEnqueuers(compiler.enqueuer.resolution, enqueuer,
|
| + typeEquivalence: (DartType a, DartType b) {
|
| + return areTypesEquivalent(unalias(a), unalias(b));
|
| + }, elementFilter: (Element element) {
|
| + if (element is ConstructorElement && element.isRedirectingFactory) {
|
| + // Redirecting factory constructors are skipped in kernel.
|
| + return false;
|
| + }
|
| + return true;
|
| + }, verbose: arguments.verbose);
|
| + checkClosedWorlds(compiler.closedWorld, closedWorld,
|
| + verbose: arguments.verbose);
|
| + });
|
| +}
|
|
|