be815e1a86
The new file pkg/dev_compiler/lib/src/analyzer/driver.dart handles building the linked summary for a build unit, and then is capable of doing analysis using LibraryAnalyzer. The algorithm is very similar to analyzer_cli's build mode. The biggest difference is that `dartdevc` has existing support for discovering source files from the explicit source list (rather than requiring every source to be listed on the command line). We don't want to break that support, so there's a bit of logic to follow imports, exports, and parts. After the linked summary is produced, DDC gets the analysis results (errors and resolved AST) for each library, and compiles it into a JS module. Change-Id: I7bf1ce1eca73fd036002e498de5924c488b534dc Reviewed-on: https://dart-review.googlesource.com/c/82469 Commit-Queue: Jenny Messerly <jmesserly@google.com> Reviewed-by: Paul Berry <paulberry@google.com> Reviewed-by: Vijay Menon <vsm@google.com>
86 lines
2.7 KiB
Dart
86 lines
2.7 KiB
Dart
// 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/analyzer/command.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 {
|
|
final Map<String, String> environment;
|
|
SourceMapContext(this.environment);
|
|
|
|
List<Step> _steps;
|
|
|
|
List<Step> get steps => _steps ??= <Step>[
|
|
const Setup(),
|
|
Compile(DevCompilerRunner(environment.containsKey("debug"))),
|
|
const StepWithD8(),
|
|
CheckSteps(environment.containsKey("debug")),
|
|
];
|
|
|
|
bool debugging() => environment.containsKey("debug");
|
|
}
|
|
|
|
class DevCompilerRunner implements CompilerRunner {
|
|
final bool debugging;
|
|
|
|
const DevCompilerRunner([this.debugging = false]);
|
|
|
|
Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
|
|
Uri outDir = outputFile.resolve(".");
|
|
String outputFilename = outputFile.pathSegments.last;
|
|
|
|
File sdkJsFile = findInOutDir("gen/utils/dartdevc/js/es6/dart_sdk.js");
|
|
var jsSdkPath = sdkJsFile.uri;
|
|
|
|
File ddcSdkSummary = findInOutDir("gen/utils/dartdevc/ddc_sdk.sum");
|
|
|
|
var ddc = getDdcDir().uri.resolve("bin/dartdevc.dart");
|
|
|
|
List<String> args = <String>[
|
|
"--modules=es6",
|
|
"--dart-sdk-summary=${ddcSdkSummary.path}",
|
|
"--library-root",
|
|
outDir.toFilePath(),
|
|
"-o",
|
|
outputFile.toFilePath(),
|
|
inputFile.toFilePath()
|
|
];
|
|
|
|
var result = compile(args);
|
|
var exitCode = result?.exitCode;
|
|
if (exitCode != 0) {
|
|
throw "Exit code: $exitCode from ddc when running 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'", "from '${uriPathForwardSlashed(jsSdkPath)}'"));
|
|
|
|
if (debugging) {
|
|
createHtmlWrapper(
|
|
sdkJsFile, outputFile, jsContent, outputFilename, outDir);
|
|
}
|
|
|
|
var inputFileName = inputFile.pathSegments.last;
|
|
var inputFileNameNoExt =
|
|
inputFileName.substring(0, inputFileName.lastIndexOf("."));
|
|
File.fromUri(outWrapperFile).writeAsStringSync(
|
|
getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename));
|
|
}
|
|
}
|
|
|
|
main(List<String> arguments) => runMe(arguments, createContext, "testing.json");
|