blob: 887b3e9b2036cceb78bf446f3ef239e963f6fd21 [file] [log] [blame] [edit]
// 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.
import 'dart:io';
import 'package:dev_compiler/src/command/arguments.dart';
import 'package:dev_compiler/src/command/command.dart';
import 'package:front_end/src/api_unstable/ddc.dart' as fe;
import 'package:sourcemap_testing/src/stepping_helper.dart';
import 'package:testing/testing.dart';
import 'common.dart';
import 'ddc_common.dart';
Future<ChainContext> createContext(
Chain suite,
Map<String, String> environment,
) async {
return SourceMapContext(environment);
}
class SourceMapContext extends ChainContextWithCleanupHelper
implements WithCompilerState {
final Map<String, String> environment;
@override
fe.InitializedCompilerState? compilerState;
SourceMapContext(this.environment);
List<Step>? _steps;
@override
List<Step> get steps {
return _steps ??= <Step>[
const Setup(),
Compile(DevCompilerRunner(this, debugging: debugging())),
const StepWithD8(),
CheckSteps(debugging()),
];
}
@override
bool debugging() => environment.containsKey('debug');
}
class DevCompilerRunner implements CompilerRunner {
final WithCompilerState context;
final bool debugging;
final String moduleFormat;
final bool canary;
const DevCompilerRunner(
this.context, {
this.debugging = false,
this.moduleFormat = 'es6',
this.canary = false,
});
@override
Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
Uri sdkJsFile;
Uri? ddcModuleLoaderFile;
if (moduleFormat == 'es6') {
sdkJsFile = findInOutDir('gen/utils/ddc/stable/sdk/es6/dart_sdk.js').uri;
} else {
assert(moduleFormat == 'ddc' && canary);
sdkJsFile = findInOutDir('gen/utils/ddc/canary/sdk/ddc/dart_sdk.js').uri;
ddcModuleLoaderFile = findInOutDir(
'dart-sdk/lib/dev_compiler/ddc/ddc_module_loader.js',
).uri;
}
var ddcSdkSummary = findInOutDir('ddc_outline.dill');
var packageConfigPath = sdkRoot!.uri
.resolve('.dart_tool/package_config.json')
.toFilePath();
var args = <String>[
'--batch',
'--packages=$packageConfigPath',
'--modules=$moduleFormat',
if (canary) '--canary',
'--dart-sdk-summary=${ddcSdkSummary.path}',
'-o',
outputFile.toFilePath(),
inputFile.toFilePath(),
];
var succeeded = false;
try {
var result = await compile(
ParsedArguments.from(args),
compilerState: context.compilerState,
);
context.compilerState =
result.compilerState as fe.InitializedCompilerState?;
succeeded = result.success;
} catch (e, s) {
print('Unhandled exception:');
print(e);
print(s);
}
if (!succeeded) {
var ddc = getDdcDir().uri.resolve('bin/dartdevc.dart');
throw 'Error from ddc when executing with something like '
'$dartExecutable ${ddc.toFilePath()} '
"${args.reduce((value, element) => '$value "$element"')}";
}
var jsContent = File.fromUri(outputFile).readAsStringSync();
File.fromUri(outputFile).writeAsStringSync(
jsContent.replaceFirst(
"from 'dart_sdk.js'",
"from '${uriPathForwardSlashed(sdkJsFile)}'",
),
);
if (debugging) {
createHtmlWrapper(
inputFile: inputFile,
sdkJsFile: sdkJsFile,
outputFile: outputFile,
jsContent: jsContent,
outputFilename: outputFile.pathSegments.last,
moduleFormat: moduleFormat,
canary: canary,
);
}
File.fromUri(outWrapperFile).writeAsStringSync(
getWrapperContent(
sdkJsFile: sdkJsFile,
ddcModuleLoaderFile: ddcModuleLoaderFile,
inputFile: inputFile,
outputFile: outputFile,
moduleFormat: moduleFormat,
canary: canary,
),
);
}
}
void main(List<String> arguments) =>
runMe(arguments, createContext, configurationPath: 'testing.json');