5aa30397d7
* refactor Analyzer CLI and DDC to use common preprocessArgs method * throw clear exception if trailing @file not found or cannot be read * update preprocessArgs method to always return new list R=brianwilkerson@google.com, vsm@google.com Review-Url: https://codereview.chromium.org/2572813002 .
76 lines
3.2 KiB
Dart
Executable File
76 lines
3.2 KiB
Dart
Executable File
#!/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).
|
|
///
|
|
/// Supported commands are
|
|
/// * compile: builds a collection of dart libraries into a single JS module
|
|
///
|
|
/// Additionally, these commands are being considered
|
|
/// * link: combines several JS modules into a single JS file
|
|
/// * build: compiles & links a set of code, automatically determining
|
|
/// appropriate groupings of libraries to combine into JS modules
|
|
/// * watch: watch a directory and recompile build units automatically
|
|
/// * serve: uses `watch` to recompile and exposes a simple static file server
|
|
/// for local development
|
|
///
|
|
/// These commands are combined so we have less names to expose on the PATH,
|
|
/// and for development simplicity while the precise UI has not been determined.
|
|
///
|
|
/// A more typical structure for web tools is simply to have the compiler with
|
|
/// "watch" as an option. The challenge for us is:
|
|
///
|
|
/// * Dart used to assume whole-program compiles, so we don't have a
|
|
/// user-declared unit of building, and neither "libraries" or "packages" will
|
|
/// work,
|
|
/// * We do not assume a `node` JS installation, so we cannot easily reuse
|
|
/// existing tools for the "link" step, or assume users have a local
|
|
/// file server,
|
|
/// * We didn't have a file watcher API at first,
|
|
/// * We had no conventions about where compiled output should go (or even
|
|
/// that we would be compiling at all, vs running on an in-browser Dart VM),
|
|
/// * We wanted a good first impression with our simple examples, so we used
|
|
/// local file servers, and users have an expectation of it now, even though
|
|
/// it doesn't scale to typical apps that need their own real servers.
|
|
|
|
import 'dart:async';
|
|
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/compiler/command.dart';
|
|
|
|
Future main(List<String> args) async {
|
|
// Always returns a new modifiable list.
|
|
args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args);
|
|
|
|
if (args.contains('--persistent_worker')) {
|
|
new _CompilerWorker(args..remove('--persistent_worker')).run();
|
|
} 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();
|
|
}
|
|
}
|