| #!/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 new _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 = new StringBuffer(); | |
| var exitCode = compile(args, printFn: output.writeln); | |
| AnalysisEngine.instance.clearCaches(); | |
| return new WorkResponse() | |
| ..exitCode = exitCode | |
| ..output = output.toString(); | |
| } | |
| } | |
| runBatch(List<String> batchArgs) async { | |
| int totalTests = 0; | |
| int testsFailed = 0; | |
| var watch = new Stopwatch()..start(); | |
| print('>>> BATCH START'); | |
| String line; | |
| while ((line = stdin.readLineSync(encoding: utf8)).isNotEmpty) { | |
| totalTests++; | |
| var args = batchArgs.toList()..addAll(line.split(new 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'); | |
| } |