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:io'; | 8 import 'dart:io'; |
9 import 'dart:math' as math; | 9 import 'dart:math' as math; |
10 | 10 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
84 } else { | 84 } else { |
85 handler.handle(argument); | 85 handler.handle(argument); |
86 } | 86 } |
87 continue OUTER; | 87 continue OUTER; |
88 } | 88 } |
89 } | 89 } |
90 throw 'Internal error: "$argument" did not match'; | 90 throw 'Internal error: "$argument" did not match'; |
91 } | 91 } |
92 } | 92 } |
93 | 93 |
94 void compile(List<String> argv) { | 94 Future compile(List<String> argv) { |
95 bool isWindows = (Platform.operatingSystem == 'windows'); | 95 bool isWindows = (Platform.operatingSystem == 'windows'); |
96 stackTraceFilePrefix = '$currentDirectory'; | 96 stackTraceFilePrefix = '$currentDirectory'; |
97 Uri libraryRoot = currentDirectory; | 97 Uri libraryRoot = currentDirectory; |
98 Uri out = currentDirectory.resolve('out.js'); | 98 Uri out = currentDirectory.resolve('out.js'); |
99 Uri sourceMapOut = currentDirectory.resolve('out.js.map'); | 99 Uri sourceMapOut = currentDirectory.resolve('out.js.map'); |
100 Uri packageRoot = null; | 100 Uri packageRoot = null; |
101 List<String> options = new List<String>(); | 101 List<String> options = new List<String>(); |
102 bool explicitOut = false; | 102 bool explicitOut = false; |
103 bool wantHelp = false; | 103 bool wantHelp = false; |
104 bool wantVersion = false; | 104 bool wantVersion = false; |
105 String outputLanguage = 'JavaScript'; | 105 String outputLanguage = 'JavaScript'; |
106 bool stripArgumentSet = false; | 106 bool stripArgumentSet = false; |
107 bool analyzeOnly = false; | 107 bool analyzeOnly = false; |
108 // TODO(johnniwinther): Measure time for reading files. | |
108 SourceFileProvider inputProvider = new SourceFileProvider(); | 109 SourceFileProvider inputProvider = new SourceFileProvider(); |
109 FormattingDiagnosticHandler diagnosticHandler = | 110 FormattingDiagnosticHandler diagnosticHandler = |
110 new FormattingDiagnosticHandler(inputProvider); | 111 new FormattingDiagnosticHandler(inputProvider); |
111 | 112 |
112 passThrough(String argument) => options.add(argument); | 113 passThrough(String argument) => options.add(argument); |
113 | 114 |
114 if (BUILD_ID != null) { | 115 if (BUILD_ID != null) { |
115 passThrough("--build-id=$BUILD_ID"); | 116 passThrough("--build-id=$BUILD_ID"); |
116 } | 117 } |
117 | 118 |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
280 '--output-type=dart'); | 281 '--output-type=dart'); |
281 } | 282 } |
282 if (arguments.isEmpty) { | 283 if (arguments.isEmpty) { |
283 helpAndFail('Error: No Dart file specified.'); | 284 helpAndFail('Error: No Dart file specified.'); |
284 } | 285 } |
285 if (arguments.length > 1) { | 286 if (arguments.length > 1) { |
286 var extra = arguments.sublist(1); | 287 var extra = arguments.sublist(1); |
287 helpAndFail('Error: Extra arguments: ${extra.join(" ")}'); | 288 helpAndFail('Error: Extra arguments: ${extra.join(" ")}'); |
288 } | 289 } |
289 | 290 |
290 void handler(Uri uri, int begin, int end, String message, | |
291 api.Diagnostic kind) { | |
292 diagnosticHandler.diagnosticHandler(uri, begin, end, message, kind); | |
293 } | |
294 | |
295 Uri uri = currentDirectory.resolve(arguments[0]); | 291 Uri uri = currentDirectory.resolve(arguments[0]); |
296 if (packageRoot == null) { | 292 if (packageRoot == null) { |
297 packageRoot = uri.resolve('./packages/'); | 293 packageRoot = uri.resolve('./packages/'); |
298 } | 294 } |
299 | 295 |
300 diagnosticHandler.info('package root is $packageRoot'); | 296 diagnosticHandler.info('package root is $packageRoot'); |
301 | 297 |
302 int totalCharactersWritten = 0; | 298 int totalCharactersWritten = 0; |
303 | 299 |
304 options.add('--source-map=$sourceMapOut'); | 300 options.add('--source-map=$sourceMapOut'); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
379 } | 375 } |
380 output.closeSync(); | 376 output.closeSync(); |
381 if (isPrimaryOutput) { | 377 if (isPrimaryOutput) { |
382 totalCharactersWritten += charactersWritten; | 378 totalCharactersWritten += charactersWritten; |
383 } | 379 } |
384 } | 380 } |
385 | 381 |
386 return new EventSinkWrapper(writeStringSync, onDone); | 382 return new EventSinkWrapper(writeStringSync, onDone); |
387 } | 383 } |
388 | 384 |
389 api.compile(uri, libraryRoot, packageRoot, | 385 return api.compile(uri, libraryRoot, packageRoot, |
390 inputProvider.readStringFromUri, handler, | 386 inputProvider, diagnosticHandler, |
391 options, outputProvider) | 387 options, outputProvider) |
392 .then(compilationDone); | 388 .then(compilationDone); |
393 } | 389 } |
394 | 390 |
395 class EventSinkWrapper extends EventSink<String> { | 391 class EventSinkWrapper extends EventSink<String> { |
396 var onAdd, onClose; | 392 var onAdd, onClose; |
397 | 393 |
398 EventSinkWrapper(this.onAdd, this.onClose); | 394 EventSinkWrapper(this.onAdd, this.onClose); |
399 | 395 |
400 void add(String data) => onAdd(data); | 396 void add(String data) => onAdd(data); |
401 | 397 |
402 void addError(error) => throw error; | 398 void addError(error) => throw error; |
(...skipping 14 matching lines...) Expand all Loading... | |
417 var file = new File(uriPathToNative(uri.path)).openSync(mode: FileMode.WRITE); | 413 var file = new File(uriPathToNative(uri.path)).openSync(mode: FileMode.WRITE); |
418 file.writeStringSync(text); | 414 file.writeStringSync(text); |
419 file.closeSync(); | 415 file.closeSync(); |
420 } | 416 } |
421 | 417 |
422 void fail(String message) { | 418 void fail(String message) { |
423 print(message); | 419 print(message); |
424 exit(1); | 420 exit(1); |
425 } | 421 } |
426 | 422 |
427 void compilerMain(Options options) { | 423 Future compilerMain(Options options) { |
428 var root = uriPathToNative("/$LIBRARY_ROOT"); | 424 var root = uriPathToNative("/$LIBRARY_ROOT"); |
429 List<String> argv = ['--library-root=${options.script}$root']; | 425 List<String> argv = ['--library-root=${options.script}$root']; |
430 argv.addAll(options.arguments); | 426 argv.addAll(options.arguments); |
431 compile(argv); | 427 return compile(argv); |
432 } | 428 } |
433 | 429 |
434 void help() { | 430 void help() { |
435 // This message should be no longer than 20 lines. The default | 431 // This message should be no longer than 20 lines. The default |
436 // terminal size normally 80x24. Two lines are used for the prompts | 432 // terminal size normally 80x24. Two lines are used for the prompts |
437 // before and after running the compiler. Another two lines may be | 433 // before and after running the compiler. Another two lines may be |
438 // used to print an error message. | 434 // used to print an error message. |
439 print(''' | 435 print(''' |
440 Usage: dart2js [options] dartfile | 436 Usage: dart2js [options] dartfile |
441 | 437 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
559 exit(0); | 555 exit(0); |
560 } | 556 } |
561 | 557 |
562 void helpAndFail(String message) { | 558 void helpAndFail(String message) { |
563 help(); | 559 help(); |
564 print(''); | 560 print(''); |
565 fail(message); | 561 fail(message); |
566 } | 562 } |
567 | 563 |
568 void mainWithErrorHandler(Options options) { | 564 void mainWithErrorHandler(Options options) { |
569 try { | 565 compilerMain(options).catchError((exception) { |
ahe
2013/09/02 13:43:24
Wrap the call to compilerMain in try-catch.
Johnni Winther
2013/09/03 07:51:39
Done.
| |
570 compilerMain(options); | |
571 } catch (exception, trace) { | |
572 try { | 566 try { |
573 print('Internal error: $exception'); | 567 print('Internal error: $exception'); |
574 } catch (ignored) { | 568 } catch (ignored) { |
575 print('Internal error: error while printing exception'); | 569 print('Internal error: error while printing exception'); |
576 } | 570 } |
571 | |
577 try { | 572 try { |
578 print(trace); | 573 var trace = getAttachedStackTrace(exception); |
574 if (trace != null) { | |
575 print(trace); | |
576 } | |
579 } finally { | 577 } finally { |
580 exit(253); // 253 is recognized as a crash by our test scripts. | 578 exit(253); // 253 is recognized as a crash by our test scripts. |
581 } | 579 } |
582 } | 580 }); |
583 } | 581 } |
584 | 582 |
585 void main() { | 583 void main() { |
586 mainWithErrorHandler(new Options()); | 584 mainWithErrorHandler(new Options()); |
587 } | 585 } |
OLD | NEW |