Index: bin/dartdevc.dart |
diff --git a/bin/dartdevc.dart b/bin/dartdevc.dart |
index 0ee480ac83faca90afbbc6f5ab5cc0e827c6ac7f..1942b7e8556b60a558b5b279b092da2989ed3fac 100755 |
--- a/bin/dartdevc.dart |
+++ b/bin/dartdevc.dart |
@@ -37,30 +37,104 @@ |
import 'dart:io'; |
import 'package:args/command_runner.dart'; |
+import 'package:bazel_worker/bazel_worker.dart'; |
import 'package:dev_compiler/src/compiler/command.dart'; |
main(List<String> args) async { |
+ // Always returns a new modifiable list. |
args = _preprocessArgs(args); |
- var runner = new CommandRunner('dartdevc', 'Dart Development Compiler'); |
- runner.addCommand(new CompileCommand()); |
+ if (args.contains('--persistent_worker')) { |
+ new _CompilerWorker(args..remove('--persistent_worker')).run(); |
+ } else { |
+ exitCode = _runCommand(args); |
+ } |
+} |
+ |
+/// Runs a single compile command, and returns an exit code. |
+int _runCommand(List<String> args, {MessageHandler messageHandler}) { |
try { |
- await runner.run(args); |
+ var runner = new CommandRunner('dartdevc', 'Dart Development Compiler'); |
+ runner.addCommand(new CompileCommand(messageHandler: messageHandler)); |
+ runner.run(args); |
} catch (e, s) { |
- exit(handleError(e, s, args)); |
+ return _handleError(e, s, args, messageHandler: messageHandler); |
} |
+ return EXIT_CODE_OK; |
} |
+/// Runs the compiler worker loop. |
+class _CompilerWorker extends SyncWorkerLoop { |
+ /// The original args supplied to the executable. |
+ final List<String> _startupArgs; |
+ |
+ _CompilerWorker(this._startupArgs) : super(); |
+ |
+ /// Performs each individual work request. |
+ WorkResponse performRequest(WorkRequest request) { |
+ var args = new List.from(_startupArgs)..addAll(request.arguments); |
+ |
+ var output = new StringBuffer(); |
+ return new WorkResponse() |
+ ..exitCode = _runCommand(args, messageHandler: output.writeln) |
+ ..output = output.toString(); |
+ } |
+} |
+ |
+/// 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, |
+ {MessageHandler messageHandler}) { |
+ messageHandler ??= 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 70; |
+ } |
+} |
+ |
+/// Always returns a new modifiable list. |
+/// |
/// If the final arg is `@file_path` then read in all the lines of that file |
/// and add those as args. |
/// |
/// Bazel actions that support workers must provide all their per-WorkRequest |
/// arguments in a file like this instead of as normal args. |
List<String> _preprocessArgs(List<String> args) { |
+ args = new List.from(args); |
if (args.isNotEmpty && args.last.startsWith('@')) { |
- return new List.from(args) |
- ..addAll(new File(args.last.substring(1)).readAsLinesSync()); |
- } else { |
- return args; |
+ var fileArg = args.removeLast(); |
+ args.addAll(new File(fileArg.substring(1)).readAsLinesSync()); |
} |
+ return args; |
} |