| #!/usr/bin/env dart |
| // Copyright (c) 2016, 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. |
| |
| /// Command line entry point for Dart Development Compiler (dartdevc), used to |
| /// compile a collection of dart libraries into a single JS module |
| |
| import 'dart:async'; |
| import 'dart:convert'; |
| import 'dart:io'; |
| import 'package:analyzer/file_system/physical_file_system.dart'; |
| import 'package:analyzer/src/command_line/arguments.dart'; |
| import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine; |
| import 'package:bazel_worker/bazel_worker.dart'; |
| import 'package:dev_compiler/src/analyzer/command.dart'; |
| |
| Future main(List<String> args) async { |
| // Always returns a new modifiable list. |
| args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args); |
| |
| if (args.contains('--persistent_worker')) { |
| await _CompilerWorker(args..remove('--persistent_worker')).run(); |
| } else if (args.isNotEmpty && args.last == "--batch") { |
| await runBatch(args.sublist(0, args.length - 1)); |
| } else { |
| exitCode = compile(args); |
| } |
| } |
| |
| /// Runs the compiler worker loop. |
| class _CompilerWorker extends AsyncWorkerLoop { |
| /// The original args supplied to the executable. |
| final List<String> _startupArgs; |
| |
| _CompilerWorker(this._startupArgs) : super(); |
| |
| /// Performs each individual work request. |
| Future<WorkResponse> performRequest(WorkRequest request) async { |
| var args = _startupArgs.toList()..addAll(request.arguments); |
| |
| var output = StringBuffer(); |
| var exitCode = compile(args, printFn: output.writeln); |
| AnalysisEngine.instance.clearCaches(); |
| return WorkResponse() |
| ..exitCode = exitCode |
| ..output = output.toString(); |
| } |
| } |
| |
| runBatch(List<String> batchArgs) async { |
| int totalTests = 0; |
| int testsFailed = 0; |
| var watch = Stopwatch()..start(); |
| print('>>> BATCH START'); |
| String line; |
| while ((line = stdin.readLineSync(encoding: utf8)).isNotEmpty) { |
| totalTests++; |
| var args = batchArgs.toList()..addAll(line.split(RegExp(r'\s+'))); |
| |
| // We don't try/catch here, since `compile` should handle that. |
| var compileExitCode = compile(args); |
| AnalysisEngine.instance.clearCaches(); |
| stderr.writeln('>>> EOF STDERR'); |
| var outcome = compileExitCode == 0 |
| ? 'PASS' |
| : compileExitCode == 70 ? 'CRASH' : 'FAIL'; |
| print('>>> TEST $outcome ${watch.elapsedMilliseconds}ms'); |
| } |
| int time = watch.elapsedMilliseconds; |
| print('>>> BATCH END ' |
| '(${totalTests - testsFailed})/$totalTests ${time}ms'); |
| } |