Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(651)

Unified Diff: bin/dartdevc.dart

Issue 1896613002: Move all args to per-request for the worker, and add a test (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: use exit code 70 for internal errors Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | lib/src/compiler/command.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « no previous file | lib/src/compiler/command.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698