#!/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 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 _startupArgs; _CompilerWorker(this._startupArgs) : super(); /// Performs each individual work request. Future 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 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'); }