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

Unified Diff: dart/lib/compiler/implementation/dart2js.dart

Issue 10383086: Implement --help option and generalize option parsing. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 7 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 | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dart/lib/compiler/implementation/dart2js.dart
diff --git a/dart/lib/compiler/implementation/dart2js.dart b/dart/lib/compiler/implementation/dart2js.dart
index 7b7fa6bc6ff4f8c943a19202fe908146307882fd..0e0f0315fae71073421c17d28721e764a6f4fb80 100644
--- a/dart/lib/compiler/implementation/dart2js.dart
+++ b/dart/lib/compiler/implementation/dart2js.dart
@@ -16,6 +16,38 @@
final String LIBRARY_ROOT = '../../../..';
+typedef void HandleOption(String option);
+
+class OptionHandler {
+ String pattern;
+ HandleOption handle;
+
+ OptionHandler(this.pattern, this.handle);
+}
+
+String extractParameter(String argument) {
+ return argument.substring(argument.indexOf('=') + 1);
+}
+
+void parseCommandLine(List<OptionHandler> handlers, List<String> argv) {
+ var patterns = <String>[];
+ for (OptionHandler handler in handlers) {
+ patterns.add(handler.pattern);
+ }
+ var pattern = new RegExp('^(${Strings.join(patterns, ")|(")})\$');
+ assert(pattern.groupCount() == handlers.length);
+ OUTER: for (String argument in argv) {
+ Match match = pattern.firstMatch(argument);
+ for (int i = 0; i < handlers.length; i++) {
+ if (match[i + 1] !== null) {
+ handlers[i].handle(argument);
+ continue OUTER;
+ }
+ }
+ throw 'Internal error: "$argument" did not match';
+ }
+}
+
void compile(List<String> argv) {
Uri cwd = getCurrentDirectory();
bool throwOnError = false;
@@ -25,41 +57,43 @@ void compile(List<String> argv) {
Uri out = cwd.resolve('out.js');
List<String> options = new List<String>();
+ passThrough(String argument) => options.add(argument);
+
List<String> arguments = <String>[];
- for (String argument in argv) {
- if ('--throw-on-error' == argument) {
- throwOnError = true;
- } else if ('--suppress-warnings' == argument) {
- showWarnings = false;
- } else if ('--verbose' == argument) {
- verbose = true;
- } else if (argument.startsWith('--library-root=')) {
- String path =
- nativeToUriPath(argument.substring(argument.indexOf('=') + 1));
+ List<OptionHandler> handlers = <OptionHandler>[
+ new OptionHandler('--throw-on-error', (_) => throwOnError = true),
+ new OptionHandler('--suppress-warnings', (_) => showWarnings = false),
+ new OptionHandler('--verbose', (_) => verbose = true),
+ new OptionHandler('--library-root=.*', (String argument) {
+ String path = nativeToUriPath(extractParameter(argument));
if (!path.endsWith("/")) path = "$path/";
libraryRoot = cwd.resolve(path);
- } else if (argument.startsWith('--out=')) {
- String path =
- nativeToUriPath(argument.substring(argument.indexOf('=') + 1));
- out = cwd.resolve(path);
- } else if ('--allow-mock-compilation' == argument) {
- options.add(argument);
- } else if ('--no-colors' == argument) {
- colors.enabled = false;
- } else if ('--enable-checked-mode' == argument) {
- options.add(argument);
- } else if (argument.startsWith('-')) {
- fail('Unknown option $argument.');
- } else {
+ }),
+ new OptionHandler('--out=.*', (String argument) {
+ out = cwd.resolve(nativeToUriPath(extractParameter(argument)));
+ }),
+ new OptionHandler('--allow-mock-compilation', passThrough),
+ new OptionHandler('--no-colors', (_) => colors.enabled = false),
+ new OptionHandler('--enable-checked-mode|--checked|-c',
+ (_) => passThrough('--enable_checked_mode')),
+ new OptionHandler('--help', (_) => helpAndExit()),
+ // The following two options must come last.
+ new OptionHandler('-.*', (String argument) {
+ fail('Error: unknown option "$argument".');
+ }),
+ new OptionHandler('.*', (String argument) {
arguments.add(nativeToUriPath(argument));
- }
- }
+ })
+ ];
+
+ parseCommandLine(handlers, argv);
+
if (arguments.isEmpty()) {
- fail('No file to compile.');
+ helpAndFail('Error: no file to compile.');
}
if (arguments.length > 1) {
var extra = arguments.getRange(1, arguments.length - 1);
- fail('Extra arguments: $extra.');
+ helpAndFail('Error: extra arguments: ${Strings.join(extra, " ")}');
}
Map<String, SourceFile> sourceFiles = <SourceFile>{};
@@ -104,7 +138,7 @@ void compile(List<String> argv) {
// directly. In effect, we don't support truly asynchronous API.
String code = api.compile(uri, libraryRoot, provider, handler, options).value;
if (code === null) {
- fail('Compilation failed.');
+ fail('Error: compilation failed.');
}
writeString(out, code);
int jsBytesWritten = code.length;
@@ -120,7 +154,7 @@ class AbortLeg {
void writeString(Uri uri, String text) {
if (uri.scheme != 'file') {
- fail('Unhandled scheme ${uri.scheme}.');
+ fail('Error: unhandled scheme ${uri.scheme}.');
}
var file = new File(uriPathToNative(uri.path)).openSync(FileMode.WRITE);
file.writeStringSync(text);
@@ -148,6 +182,38 @@ void compilerMain(Options options) {
compile(argv);
}
+void help() {
+ // This message should be no longer than 22 lines. The default
+ // terminal size normally 80x24. Two lines are used for the prompts
+ // before and after running the compiler.
+ print('''
+dart2js [OPTIONS...] DART-FILE
+
+A Dart to JavaScript compiler.
+
+By default, the compiled JavaScript code is saved to a file named
+out.js in the current directory.
+
+Common options:
+
+ --help Display this message.
+
+ --out=FILE Save the output to FILE (default is out.js).
sethladd 2012/05/09 18:08:12 I believe the new dart.js file that Kasper updated
+
+ --checked Turn on checked mode in generated JavaScript code.
+''');
+}
+
+void helpAndExit() {
+ help();
+ exit(0);
+}
+
+void helpAndFail(String message) {
+ help();
+ fail(message);
+}
+
void main() {
try {
compilerMain(new Options());
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698