| Index: tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart
|
| diff --git a/tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart b/tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1c66cd642eaa81e45c92bd43b00444169cd447ae
|
| --- /dev/null
|
| +++ b/tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart
|
| @@ -0,0 +1,122 @@
|
| +// Copyright (c) 2017, 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_world_from_dill_test;
|
| +
|
| +import 'dart:async';
|
| +import 'dart:io';
|
| +
|
| +import 'package:async_helper/async_helper.dart';
|
| +import 'package:compiler/src/commandline_options.dart';
|
| +import 'package:compiler/src/common.dart';
|
| +import 'package:compiler/src/compiler.dart';
|
| +import 'package:compiler/src/elements/resolution_types.dart';
|
| +import 'package:compiler/src/elements/types.dart';
|
| +import 'package:compiler/src/enqueue.dart';
|
| +import 'package:compiler/src/kernel/element_map.dart';
|
| +import 'package:compiler/src/kernel/kernel_strategy.dart';
|
| +import 'package:compiler/src/resolution/enum_creator.dart';
|
| +import 'package:compiler/src/universe/world_builder.dart';
|
| +import 'package:compiler/src/world.dart';
|
| +import 'package:expect/expect.dart';
|
| +import '../memory_compiler.dart';
|
| +import '../equivalence/check_functions.dart';
|
| +import '../serialization/helper.dart';
|
| +import 'test_helpers.dart';
|
| +
|
| +import 'compiler_helper.dart';
|
| +
|
| +const SOURCE = const {
|
| + 'main.dart': '''
|
| +main() {
|
| + print('Hello World');
|
| +}
|
| +'''
|
| +};
|
| +
|
| +main(List<String> args) {
|
| + asyncTest(() async {
|
| + await mainInternal(args);
|
| + });
|
| +}
|
| +
|
| +enum ResultKind { crashes, errors, warnings, success, failure }
|
| +
|
| +Future<ResultKind> mainInternal(List<String> args,
|
| + {bool skipWarnings: false, bool skipErrors: false}) async {
|
| + 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;
|
| + }
|
| +
|
| + enableDebugMode();
|
| + EnumCreator.matchKernelRepresentationForTesting = true;
|
| +
|
| + Directory dir = await Directory.systemTemp.createTemp('dart2js-with-dill');
|
| + print('--- create temp directory $dir -------------------------------');
|
| + memorySourceFiles.forEach((String name, String source) {
|
| + new File.fromUri(dir.uri.resolve(name)).writeAsStringSync(source);
|
| + });
|
| + entryPoint = dir.uri.resolve(entryPoint.path);
|
| +
|
| + print('---- analyze-only ------------------------------------------------');
|
| + DiagnosticCollector collector = new DiagnosticCollector();
|
| + Compiler compiler1 = compilerFor(
|
| + entryPoint: entryPoint,
|
| + diagnosticHandler: collector,
|
| + options: [Flags.analyzeOnly, Flags.enableAssertMessage]);
|
| + ElementResolutionWorldBuilder.useInstantiationMap = true;
|
| + compiler1.resolution.retainCachesForTesting = true;
|
| + await compiler1.run(entryPoint);
|
| + if (collector.crashes.isNotEmpty) {
|
| + print('Skipping due to crashes.');
|
| + return ResultKind.crashes;
|
| + }
|
| + if (collector.errors.isNotEmpty && skipErrors) {
|
| + print('Skipping due to errors.');
|
| + return ResultKind.errors;
|
| + }
|
| + if (collector.warnings.isNotEmpty && skipWarnings) {
|
| + print('Skipping due to warnings.');
|
| + return ResultKind.warnings;
|
| + }
|
| + Expect.isFalse(compiler1.compilationFailed);
|
| + ResolutionEnqueuer enqueuer1 = compiler1.enqueuer.resolution;
|
| + ClosedWorld closedWorld1 = compiler1.resolutionWorldBuilder.closeWorld();
|
| +
|
| + Compiler compiler2 =
|
| + await compileWithDill(entryPoint, const {}, printSteps: true);
|
| +
|
| + KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy;
|
| + KernelToElementMap elementMap = frontEndStrategy.elementMap;
|
| +
|
| + Expect.isFalse(compiler2.compilationFailed);
|
| +
|
| + KernelEquivalence equivalence = new KernelEquivalence(elementMap);
|
| +
|
| + ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution;
|
| + ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld();
|
| +
|
| + checkBackendUsage(closedWorld1.backendUsage, closedWorld2.backendUsage,
|
| + equivalence.defaultStrategy);
|
| +
|
| + checkResolutionEnqueuers(closedWorld1.backendUsage, closedWorld2.backendUsage,
|
| + enqueuer1, enqueuer2, elementEquivalence: equivalence.entityEquivalence,
|
| + typeEquivalence: (ResolutionDartType a, DartType b) {
|
| + return equivalence.typeEquivalence(unalias(a), b);
|
| + }, elementFilter: elementFilter, verbose: arguments.verbose);
|
| +
|
| + checkClosedWorlds(closedWorld1, closedWorld2,
|
| + strategy: equivalence.defaultStrategy, verbose: arguments.verbose);
|
| +
|
| + return ResultKind.success;
|
| +}
|
|
|