Index: lib/src/compiler/command.dart |
diff --git a/lib/src/compiler/command.dart b/lib/src/compiler/command.dart |
index 686dddfae493a29d3ccd42b1c32ad7b67e17ff43..6cb95da11657320bd2d0a2beddf127ab9143696a 100644 |
--- a/lib/src/compiler/command.dart |
+++ b/lib/src/compiler/command.dart |
@@ -8,53 +8,42 @@ import 'package:args/command_runner.dart'; |
import 'package:analyzer/src/generated/source.dart' show Source; |
import 'package:analyzer/src/summary/package_bundle_reader.dart' |
show InSummarySource; |
-import 'package:bazel_worker/bazel_worker.dart'; |
import 'compiler.dart' |
show BuildUnit, CompilerOptions, JSModuleFile, ModuleCompiler; |
import '../analyzer/context.dart' show AnalyzerOptions; |
import 'package:path/path.dart' as path; |
+typedef void MessageHandler(Object message); |
+ |
/// The command for invoking the modular compiler. |
class CompileCommand extends Command { |
get name => 'compile'; |
get description => 'Compile a set of Dart files into a JavaScript module.'; |
+ final MessageHandler messageHandler; |
- CompileCommand() { |
+ CompileCommand({MessageHandler messageHandler}) |
+ : this.messageHandler = messageHandler ?? print { |
argParser.addOption('out', abbr: 'o', help: 'Output file (required)'); |
- argParser.addFlag('persistent_worker', |
- help: 'Run in a persistent Bazel worker (http://bazel.io/)\n', |
- defaultsTo: false, |
- hide: true); |
CompilerOptions.addArguments(argParser); |
AnalyzerOptions.addArguments(argParser); |
} |
@override |
void run() { |
- var analyzerOptions = new AnalyzerOptions.fromArguments(argResults); |
- if (argResults['persistent_worker']) { |
- new _CompilerWorker(analyzerOptions, this).run(); |
- } else { |
- compile( |
- new ModuleCompiler(analyzerOptions), |
- new CompilerOptions.fromArguments(argResults), |
- argResults['out'], |
- argResults.rest); |
- } |
- } |
+ var compiler = |
+ new ModuleCompiler(new AnalyzerOptions.fromArguments(argResults)); |
+ var compilerOptions = new CompilerOptions.fromArguments(argResults); |
+ var outPath = argResults['out']; |
- void compile(ModuleCompiler compiler, CompilerOptions compilerOptions, |
- String outPath, List<String> extraArgs, |
- {void forEachError(String error): print}) { |
if (outPath == null) { |
usageException('Please include the output file location. For example:\n' |
' -o PATH/TO/OUTPUT_FILE.js'); |
} |
- var unit = new BuildUnit( |
- path.basenameWithoutExtension(outPath), extraArgs, _moduleForLibrary); |
+ var unit = new BuildUnit(path.basenameWithoutExtension(outPath), |
+ argResults.rest, _moduleForLibrary); |
JSModuleFile module = compiler.compile(unit, compilerOptions); |
- module.errors.forEach(forEachError); |
+ module.errors.forEach(messageHandler); |
if (!module.isValid) throw new CompileErrorException(); |
@@ -83,81 +72,7 @@ class CompileCommand extends Command { |
} |
} |
-/// Handles [error] in a uniform fashion. Returns the proper exit code and calls |
-/// [messageHandler] with messages. |
-int handleError(dynamic error, dynamic stackTrace, List<String> args, |
- {void messageHandler(Object message): print}) { |
- if (error is UsageException) { |
- // Incorrect usage, input file not found, etc. |
- messageHandler(error); |
- return 64; |
- } else if (error is CompileErrorException) { |
- // Code has error(s) and failed to compile. |
- messageHandler(error); |
- return 1; |
- } else { |
- // Anything else is likely a compiler bug. |
- // |
- // --unsafe-force-compile is a bit of a grey area, but it's nice not to |
- // crash while compiling |
- // (of course, output code may crash, if it had errors). |
- // |
- messageHandler(""); |
- messageHandler("We're sorry, you've found a bug in our compiler."); |
- messageHandler("You can report this bug at:"); |
- messageHandler(" https://github.com/dart-lang/dev_compiler/issues"); |
- messageHandler(""); |
- messageHandler( |
- "Please include the information below in your report, along with"); |
- messageHandler( |
- "any other information that may help us track it down. Thanks!"); |
- messageHandler(""); |
- messageHandler(" dartdevc arguments: " + args.join(' ')); |
- messageHandler(" dart --version: ${Platform.version}"); |
- messageHandler(""); |
- messageHandler("```"); |
- messageHandler(error); |
- messageHandler(stackTrace); |
- messageHandler("```"); |
- return 1; |
- } |
-} |
- |
/// Thrown when the input source code has errors. |
class CompileErrorException implements Exception { |
toString() => '\nPlease fix all errors before compiling (warnings are okay).'; |
} |
- |
-/// Runs the compiler worker loop. |
-class _CompilerWorker extends SyncWorkerLoop { |
- final AnalyzerOptions analyzerOptions; |
- final CompileCommand compileCommand; |
- |
- _CompilerWorker(this.analyzerOptions, this.compileCommand) : super(); |
- |
- WorkResponse performRequest(WorkRequest request) { |
- var arguments = new List.from(request.arguments) |
- ..addAll(compileCommand.argResults.rest); |
- var argResults = compileCommand.argParser.parse(arguments); |
- |
- var output = new StringBuffer(); |
- try { |
- compileCommand.compile( |
- new ModuleCompiler(analyzerOptions), |
- new CompilerOptions.fromArguments(argResults), |
- argResults['out'], |
- argResults.rest, |
- forEachError: output.writeln); |
- return new WorkResponse() |
- ..exitCode = EXIT_CODE_OK |
- ..output = output.toString(); |
- } catch (e, s) { |
- var response = new WorkResponse(); |
- var output = new StringBuffer(); |
- response.exitCode = |
- handleError(e, s, request.arguments, messageHandler: output.writeln); |
- response.output = output.toString(); |
- return response; |
- } |
- } |
-} |