Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library dart2js.cmdline; | 5 library dart2js.cmdline; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection' show Queue, LinkedHashMap; | 8 import 'dart:collection' show Queue, LinkedHashMap; |
| 9 import 'dart:io'; | 9 import 'dart:io'; |
| 10 import 'dart:utf'; | 10 import 'dart:utf'; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 /** | 22 /** |
| 23 * A string to identify the revision or build. | 23 * A string to identify the revision or build. |
| 24 * | 24 * |
| 25 * This ID is displayed if the compiler crashes and in verbose mode, and is | 25 * This ID is displayed if the compiler crashes and in verbose mode, and is |
| 26 * an aid in reproducing bug reports. | 26 * an aid in reproducing bug reports. |
| 27 * | 27 * |
| 28 * The actual string is rewritten by a wrapper script when included in the sdk. | 28 * The actual string is rewritten by a wrapper script when included in the sdk. |
| 29 */ | 29 */ |
| 30 String BUILD_ID = null; | 30 String BUILD_ID = null; |
| 31 | 31 |
| 32 typedef void HandleOption(String option); | 32 typedef void HandleOption(var argument, [Iterator<String> rest]); |
| 33 | 33 |
| 34 class OptionHandler { | 34 class OptionHandler { |
| 35 String pattern; | 35 final String pattern; |
| 36 HandleOption handle; | 36 final HandleOption handle; |
| 37 final bool multipleArguments; | |
| 37 | 38 |
| 38 OptionHandler(this.pattern, this.handle); | 39 OptionHandler(this.pattern, this.handle, {this.multipleArguments: false}); |
| 39 } | 40 } |
| 40 | 41 |
| 41 /** | 42 /** |
| 42 * Extract the parameter of an option. | 43 * Extract the parameter of an option. |
| 43 * | 44 * |
| 44 * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters | 45 * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters |
| 45 * are ['fisk.js'] and ['hest.js'], respectively. | 46 * are ['fisk.js'] and ['hest.js'], respectively. |
| 46 */ | 47 */ |
| 47 String extractParameter(String argument) { | 48 String extractParameter(String argument) { |
| 48 // m[0] is the entire match (which will be equal to argument). m[1] | 49 // m[0] is the entire match (which will be equal to argument). m[1] |
| 49 // is something like "-o" or "--out=", and m[2] is the parameter. | 50 // is something like "-o" or "--out=", and m[2] is the parameter. |
| 50 Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument); | 51 Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument); |
| 51 if (m == null) helpAndFail('Error: Unknown option "$argument".'); | 52 if (m == null) helpAndFail('Error: Unknown option "$argument".'); |
| 52 return m[2]; | 53 return m[2]; |
| 53 } | 54 } |
| 54 | 55 |
| 55 String extractPath(String argument) { | 56 String extractPath(String argument) { |
| 56 String path = nativeToUriPath(extractParameter(argument)); | 57 String path = nativeToUriPath(extractParameter(argument)); |
| 57 return path.endsWith("/") ? path : "$path/"; | 58 return path.endsWith("/") ? path : "$path/"; |
| 58 } | 59 } |
| 59 | 60 |
| 60 void parseCommandLine(List<OptionHandler> handlers, List<String> argv) { | 61 void parseCommandLine(List<OptionHandler> handlers, List<String> argv) { |
| 61 // TODO(ahe): Use ../../args/args.dart for parsing options instead. | 62 // TODO(ahe): Use ../../args/args.dart for parsing options instead. |
| 62 var patterns = <String>[]; | 63 var patterns = <String>[]; |
| 63 for (OptionHandler handler in handlers) { | 64 for (OptionHandler handler in handlers) { |
| 64 patterns.add(handler.pattern); | 65 patterns.add(handler.pattern); |
| 65 } | 66 } |
| 66 var pattern = new RegExp('^(${patterns.join(")\$|(")})\$'); | 67 var pattern = new RegExp('^(${patterns.join(")\$|(")})\$'); |
| 67 OUTER: for (String argument in argv) { | 68 |
| 69 Iterator<String> arguments = argv.iterator; | |
| 70 OUTER: while (arguments.moveNext()) { | |
| 71 String argument = arguments.current; | |
| 68 Match match = pattern.firstMatch(argument); | 72 Match match = pattern.firstMatch(argument); |
| 69 assert(match.groupCount == handlers.length); | 73 assert(match.groupCount == handlers.length); |
| 70 for (int i = 0; i < handlers.length; i++) { | 74 for (int i = 0; i < handlers.length; i++) { |
| 71 if (match[i + 1] != null) { | 75 if (match[i + 1] != null) { |
| 72 handlers[i].handle(argument); | 76 OptionHandler handler = handlers[i]; |
| 77 if (handler.multipleArguments) { | |
| 78 handler.handle(argument, arguments); | |
| 79 } else { | |
| 80 handler.handle(argument); | |
| 81 } | |
| 73 continue OUTER; | 82 continue OUTER; |
| 74 } | 83 } |
| 75 } | 84 } |
| 76 throw 'Internal error: "$argument" did not match'; | 85 throw 'Internal error: "$argument" did not match'; |
| 77 } | 86 } |
| 78 } | 87 } |
| 79 | 88 |
| 80 void compile(List<String> argv) { | 89 void compile(List<String> argv) { |
| 81 bool isWindows = (Platform.operatingSystem == 'windows'); | 90 bool isWindows = (Platform.operatingSystem == 'windows'); |
| 82 Uri libraryRoot = currentDirectory; | 91 Uri libraryRoot = currentDirectory; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 101 } | 110 } |
| 102 | 111 |
| 103 setLibraryRoot(String argument) { | 112 setLibraryRoot(String argument) { |
| 104 libraryRoot = currentDirectory.resolve(extractPath(argument)); | 113 libraryRoot = currentDirectory.resolve(extractPath(argument)); |
| 105 } | 114 } |
| 106 | 115 |
| 107 setPackageRoot(String argument) { | 116 setPackageRoot(String argument) { |
| 108 packageRoot = currentDirectory.resolve(extractPath(argument)); | 117 packageRoot = currentDirectory.resolve(extractPath(argument)); |
| 109 } | 118 } |
| 110 | 119 |
| 111 setOutput(String argument) { | 120 setOutput(String argument, Iterator<String> rest) { |
| 121 String path; | |
| 122 if (argument == '-o') { | |
| 123 if (!rest.moveNext()) { | |
| 124 helpAndFail('Error: Missing file after -o option.'); | |
| 125 } | |
| 126 path = rest.current; | |
| 127 } else { | |
| 128 path = extractParameter(argument); | |
| 129 } | |
| 112 explicitOut = true; | 130 explicitOut = true; |
| 113 out = currentDirectory.resolve(nativeToUriPath(extractParameter(argument))); | 131 out = currentDirectory.resolve(nativeToUriPath(path)); |
| 114 sourceMapOut = Uri.parse('$out.map'); | 132 sourceMapOut = Uri.parse('$out.map'); |
| 115 } | 133 } |
| 116 | 134 |
| 117 setOutputType(String argument) { | 135 setOutputType(String argument) { |
| 118 if (argument == '--output-type=dart') { | 136 if (argument == '--output-type=dart') { |
| 119 outputLanguage = OUTPUT_LANGUAGE_DART; | 137 outputLanguage = OUTPUT_LANGUAGE_DART; |
| 120 if (!explicitOut) { | 138 if (!explicitOut) { |
| 121 out = currentDirectory.resolve('out.dart'); | 139 out = currentDirectory.resolve('out.dart'); |
| 122 sourceMapOut = currentDirectory.resolve('out.dart.map'); | 140 sourceMapOut = currentDirectory.resolve('out.dart.map'); |
| 123 } | 141 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 passThrough('--enable-checked-mode'); | 202 passThrough('--enable-checked-mode'); |
| 185 break; | 203 break; |
| 186 default: | 204 default: |
| 187 throw 'Internal error: "$shortOption" did not match'; | 205 throw 'Internal error: "$shortOption" did not match'; |
| 188 } | 206 } |
| 189 } | 207 } |
| 190 } | 208 } |
| 191 | 209 |
| 192 List<String> arguments = <String>[]; | 210 List<String> arguments = <String>[]; |
| 193 List<OptionHandler> handlers = <OptionHandler>[ | 211 List<OptionHandler> handlers = <OptionHandler>[ |
| 194 new OptionHandler('-[chv?]+', handleShortOptions), | 212 new OptionHandler('-[chv?]+', handleShortOptions), |
|
ahe
2013/05/30 10:02:49
I would expect a type error here in checked mode.
| |
| 195 new OptionHandler('--throw-on-error', | 213 new OptionHandler('--throw-on-error', |
| 196 (_) => diagnosticHandler.throwOnError = true), | 214 (_) => diagnosticHandler.throwOnError = true), |
| 197 new OptionHandler('--suppress-warnings', | 215 new OptionHandler('--suppress-warnings', |
| 198 (_) => diagnosticHandler.showWarnings = false), | 216 (_) => diagnosticHandler.showWarnings = false), |
| 199 new OptionHandler('--output-type=dart|--output-type=js', setOutputType), | 217 new OptionHandler('--output-type=dart|--output-type=js', setOutputType), |
| 200 new OptionHandler('--verbose', setVerbose), | 218 new OptionHandler('--verbose', setVerbose), |
| 201 new OptionHandler('--version', (_) => wantVersion = true), | 219 new OptionHandler('--version', (_) => wantVersion = true), |
| 202 new OptionHandler('--library-root=.+', setLibraryRoot), | 220 new OptionHandler('--library-root=.+', setLibraryRoot), |
| 203 new OptionHandler('--out=.+|-o.+', setOutput), | 221 new OptionHandler('--out=.+|-o.*', setOutput, multipleArguments: true), |
| 204 new OptionHandler('--allow-mock-compilation', passThrough), | 222 new OptionHandler('--allow-mock-compilation', passThrough), |
| 205 new OptionHandler('--minify', passThrough), | 223 new OptionHandler('--minify', passThrough), |
| 206 new OptionHandler('--force-strip=.*', setStrip), | 224 new OptionHandler('--force-strip=.*', setStrip), |
| 207 // TODO(ahe): Remove the --no-colors option. | 225 // TODO(ahe): Remove the --no-colors option. |
| 208 new OptionHandler('--disable-diagnostic-colors', | 226 new OptionHandler('--disable-diagnostic-colors', |
| 209 (_) => diagnosticHandler.enableColors = false), | 227 (_) => diagnosticHandler.enableColors = false), |
| 210 new OptionHandler('--enable-diagnostic-colors', | 228 new OptionHandler('--enable-diagnostic-colors', |
| 211 (_) => diagnosticHandler.enableColors = true), | 229 (_) => diagnosticHandler.enableColors = true), |
| 212 new OptionHandler('--enable[_-]checked[_-]mode|--checked', | 230 new OptionHandler('--enable[_-]checked[_-]mode|--checked', |
| 213 (_) => passThrough('--enable-checked-mode')), | 231 (_) => passThrough('--enable-checked-mode')), |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 386 // This message should be no longer than 20 lines. The default | 404 // This message should be no longer than 20 lines. The default |
| 387 // terminal size normally 80x24. Two lines are used for the prompts | 405 // terminal size normally 80x24. Two lines are used for the prompts |
| 388 // before and after running the compiler. Another two lines may be | 406 // before and after running the compiler. Another two lines may be |
| 389 // used to print an error message. | 407 // used to print an error message. |
| 390 print(''' | 408 print(''' |
| 391 Usage: dart2js [options] dartfile | 409 Usage: dart2js [options] dartfile |
| 392 | 410 |
| 393 Compiles Dart to JavaScript. | 411 Compiles Dart to JavaScript. |
| 394 | 412 |
| 395 Common options: | 413 Common options: |
| 396 -o<file> Generate the output into <file>. | 414 -o <file> Generate the output into <file>. |
| 397 -c Insert runtime type checks and enable assertions (checked mode). | 415 -c Insert runtime type checks and enable assertions (checked mode). |
| 398 -h Display this message (add -v for information about all options).'''); | 416 -h Display this message (add -v for information about all options).''') ; |
| 399 } | 417 } |
| 400 | 418 |
| 401 void verboseHelp() { | 419 void verboseHelp() { |
| 402 print(''' | 420 print(''' |
| 403 Usage: dart2js [options] dartfile | 421 Usage: dart2js [options] dartfile |
| 404 | 422 |
| 405 Compiles Dart to JavaScript. | 423 Compiles Dart to JavaScript. |
| 406 | 424 |
| 407 Supported options: | 425 Supported options: |
| 408 -o<file>, --out=<file> | 426 -o <file>, --out=<file> |
| 409 Generate the output into <file>. | 427 Generate the output into <file>. |
| 410 | 428 |
| 411 -c, --enable-checked-mode, --checked | 429 -c, --enable-checked-mode, --checked |
| 412 Insert runtime type checks and enable assertions (checked mode). | 430 Insert runtime type checks and enable assertions (checked mode). |
| 413 | 431 |
| 414 -h, /h, /?, --help | 432 -h, /h, /?, --help |
| 415 Display this message (add -v for information about all options). | 433 Display this message (add -v for information about all options). |
| 416 | 434 |
| 417 -v, --verbose | 435 -v, --verbose |
| 418 Display verbose information. | 436 Display verbose information. |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 530 print(trace); | 548 print(trace); |
| 531 } finally { | 549 } finally { |
| 532 exit(253); // 253 is recognized as a crash by our test scripts. | 550 exit(253); // 253 is recognized as a crash by our test scripts. |
| 533 } | 551 } |
| 534 } | 552 } |
| 535 } | 553 } |
| 536 | 554 |
| 537 void main() { | 555 void main() { |
| 538 mainWithErrorHandler(new Options()); | 556 mainWithErrorHandler(new Options()); |
| 539 } | 557 } |
| OLD | NEW |