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 show Future, EventSink; | 8 show Future, EventSink; |
9 import 'dart:convert' show UTF8, LineSplitter; | 9 import 'dart:convert' show UTF8, LineSplitter; |
10 import 'dart:io' | 10 import 'dart:io' |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 } | 93 } |
94 continue OUTER; | 94 continue OUTER; |
95 } | 95 } |
96 } | 96 } |
97 throw 'Internal error: "$argument" did not match'; | 97 throw 'Internal error: "$argument" did not match'; |
98 } | 98 } |
99 } | 99 } |
100 | 100 |
101 FormattingDiagnosticHandler diagnosticHandler; | 101 FormattingDiagnosticHandler diagnosticHandler; |
102 | 102 |
103 Future compile(List<String> argv) { | 103 Future<api.CompilationResult> compile(List<String> argv) { |
104 stackTraceFilePrefix = '$currentDirectory'; | 104 stackTraceFilePrefix = '$currentDirectory'; |
105 Uri libraryRoot = currentDirectory; | 105 Uri libraryRoot = currentDirectory; |
106 Uri out = currentDirectory.resolve('out.js'); | 106 Uri out = currentDirectory.resolve('out.js'); |
107 Uri sourceMapOut = currentDirectory.resolve('out.js.map'); | 107 Uri sourceMapOut = currentDirectory.resolve('out.js.map'); |
108 Uri packageRoot = null; | 108 Uri packageRoot = null; |
109 List<String> options = new List<String>(); | 109 List<String> options = new List<String>(); |
110 bool explicitOut = false; | 110 bool explicitOut = false; |
111 bool wantHelp = false; | 111 bool wantHelp = false; |
112 bool wantVersion = false; | 112 bool wantVersion = false; |
113 String outputLanguage = 'JavaScript'; | 113 String outputLanguage = 'JavaScript'; |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 | 415 |
416 diagnosticHandler.info('Package root is $packageRoot'); | 416 diagnosticHandler.info('Package root is $packageRoot'); |
417 | 417 |
418 options.add('--out=$out'); | 418 options.add('--out=$out'); |
419 options.add('--source-map=$sourceMapOut'); | 419 options.add('--source-map=$sourceMapOut'); |
420 | 420 |
421 RandomAccessFileOutputProvider outputProvider = | 421 RandomAccessFileOutputProvider outputProvider = |
422 new RandomAccessFileOutputProvider( | 422 new RandomAccessFileOutputProvider( |
423 out, sourceMapOut, onInfo: diagnosticHandler.info, onFailure: fail); | 423 out, sourceMapOut, onInfo: diagnosticHandler.info, onFailure: fail); |
424 | 424 |
425 compilationDone(String code) { | 425 api.CompilationResult compilationDone(api.CompilationResult result) { |
426 if (analyzeOnly) return; | 426 if (analyzeOnly) return result; |
427 if (code == null) { | 427 if (!result.isSuccess) { |
428 fail('Compilation failed.'); | 428 fail('Compilation failed.'); |
429 } | 429 } |
430 writeString(Uri.parse('$out.deps'), | 430 writeString(Uri.parse('$out.deps'), |
431 getDepsOutput(inputProvider.sourceFiles)); | 431 getDepsOutput(inputProvider.sourceFiles)); |
432 diagnosticHandler.info( | 432 diagnosticHandler.info( |
433 'Compiled ${inputProvider.dartCharactersRead} characters Dart ' | 433 'Compiled ${inputProvider.dartCharactersRead} characters Dart ' |
434 '-> ${outputProvider.totalCharactersWritten} characters ' | 434 '-> ${outputProvider.totalCharactersWritten} characters ' |
435 '$outputLanguage in ' | 435 '$outputLanguage in ' |
436 '${relativize(currentDirectory, out, Platform.isWindows)}'); | 436 '${relativize(currentDirectory, out, Platform.isWindows)}'); |
437 if (diagnosticHandler.verbose) { | 437 if (diagnosticHandler.verbose) { |
438 String input = uriPathToNative(arguments[0]); | 438 String input = uriPathToNative(arguments[0]); |
439 print('Dart file ($input) compiled to $outputLanguage.'); | 439 print('Dart file ($input) compiled to $outputLanguage.'); |
440 print('Wrote the following files:'); | 440 print('Wrote the following files:'); |
441 for (String filename in outputProvider.allOutputFiles) { | 441 for (String filename in outputProvider.allOutputFiles) { |
442 print(" $filename"); | 442 print(" $filename"); |
443 } | 443 } |
444 } else if (!explicitOut) { | 444 } else if (!explicitOut) { |
445 String input = uriPathToNative(arguments[0]); | 445 String input = uriPathToNative(arguments[0]); |
446 String output = relativize(currentDirectory, out, Platform.isWindows); | 446 String output = relativize(currentDirectory, out, Platform.isWindows); |
447 print('Dart file ($input) compiled to $outputLanguage: $output'); | 447 print('Dart file ($input) compiled to $outputLanguage: $output'); |
448 } | 448 } |
| 449 return result; |
449 } | 450 } |
450 | 451 |
451 return compileFunc(uri, libraryRoot, packageRoot, | 452 return compileFunc(uri, libraryRoot, packageRoot, |
452 inputProvider, diagnosticHandler, | 453 inputProvider, diagnosticHandler, |
453 options, outputProvider, environment) | 454 options, outputProvider, environment) |
454 .then(compilationDone); | 455 .then(compilationDone); |
455 } | 456 } |
456 | 457 |
457 class AbortLeg { | 458 class AbortLeg { |
458 final message; | 459 final message; |
(...skipping 13 matching lines...) Expand all Loading... |
472 void fail(String message) { | 473 void fail(String message) { |
473 if (diagnosticHandler != null) { | 474 if (diagnosticHandler != null) { |
474 diagnosticHandler.diagnosticHandler( | 475 diagnosticHandler.diagnosticHandler( |
475 null, -1, -1, message, api.Diagnostic.ERROR); | 476 null, -1, -1, message, api.Diagnostic.ERROR); |
476 } else { | 477 } else { |
477 print('Error: $message'); | 478 print('Error: $message'); |
478 } | 479 } |
479 exitFunc(1); | 480 exitFunc(1); |
480 } | 481 } |
481 | 482 |
482 Future compilerMain(List<String> arguments) { | 483 Future<api.CompilationResult> compilerMain(List<String> arguments) { |
483 var root = uriPathToNative("/$LIBRARY_ROOT"); | 484 var root = uriPathToNative("/$LIBRARY_ROOT"); |
484 arguments = <String>['--library-root=${Platform.script.toFilePath()}$root'] | 485 arguments = <String>['--library-root=${Platform.script.toFilePath()}$root'] |
485 ..addAll(arguments); | 486 ..addAll(arguments); |
486 return compile(arguments); | 487 return compile(arguments); |
487 } | 488 } |
488 | 489 |
489 void help() { | 490 void help() { |
490 // This message should be no longer than 20 lines. The default | 491 // This message should be no longer than 20 lines. The default |
491 // terminal size normally 80x24. Two lines are used for the prompts | 492 // terminal size normally 80x24. Two lines are used for the prompts |
492 // before and after running the compiler. Another two lines may be | 493 // before and after running the compiler. Another two lines may be |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 if (arguments.length > 0 && arguments.last == "--batch") { | 636 if (arguments.length > 0 && arguments.last == "--batch") { |
636 batchMain(arguments.sublist(0, arguments.length - 1)); | 637 batchMain(arguments.sublist(0, arguments.length - 1)); |
637 return; | 638 return; |
638 } | 639 } |
639 internalMain(arguments); | 640 internalMain(arguments); |
640 } | 641 } |
641 | 642 |
642 var exitFunc = exit; | 643 var exitFunc = exit; |
643 var compileFunc = api.compile; | 644 var compileFunc = api.compile; |
644 | 645 |
645 Future internalMain(List<String> arguments) { | 646 Future<api.CompilationResult> internalMain(List<String> arguments) { |
646 onError(exception, trace) { | 647 api.CompilationResult onError(exception, trace) { |
647 try { | 648 try { |
648 print('The compiler crashed: $exception'); | 649 print('The compiler crashed: $exception'); |
649 } catch (ignored) { | 650 } catch (ignored) { |
650 print('The compiler crashed: error while printing exception'); | 651 print('The compiler crashed: error while printing exception'); |
651 } | 652 } |
652 | 653 |
653 try { | 654 try { |
654 if (trace != null) { | 655 if (trace != null) { |
655 print(trace); | 656 print(trace); |
656 } | 657 } |
657 } finally { | 658 } finally { |
658 exitFunc(253); // 253 is recognized as a crash by our test scripts. | 659 exitFunc(253); // 253 is recognized as a crash by our test scripts. |
659 } | 660 } |
| 661 return new api.CompilationResult.error(exception, trace); |
660 } | 662 } |
661 | 663 |
662 try { | 664 try { |
663 return compilerMain(arguments).catchError(onError); | 665 return compilerMain(arguments).catchError(onError); |
664 } catch (exception, trace) { | 666 } catch (exception, trace) { |
665 onError(exception, trace); | 667 return new Future<api.CompilationResult>.value(onError(exception, trace)); |
666 return new Future.value(); | |
667 } | 668 } |
668 } | 669 } |
669 | 670 |
670 const _EXIT_SIGNAL = const Object(); | 671 const _EXIT_SIGNAL = const Object(); |
671 | 672 |
672 void batchMain(List<String> batchArguments) { | 673 void batchMain(List<String> batchArguments) { |
673 int exitCode; | 674 int exitCode; |
674 exitFunc = (errorCode) { | 675 exitFunc = (errorCode) { |
675 // Since we only throw another part of the compiler might intercept our | 676 // Since we only throw another part of the compiler might intercept our |
676 // exception and try to exit with a different code. | 677 // exception and try to exit with a different code. |
(...skipping 26 matching lines...) Expand all Loading... |
703 } else if (exitCode == 253) { | 704 } else if (exitCode == 253) { |
704 print(">>> TEST CRASH"); | 705 print(">>> TEST CRASH"); |
705 } else { | 706 } else { |
706 print(">>> TEST FAIL"); | 707 print(">>> TEST FAIL"); |
707 } | 708 } |
708 stderr.writeln(">>> EOF STDERR"); | 709 stderr.writeln(">>> EOF STDERR"); |
709 subscription.resume(); | 710 subscription.resume(); |
710 }); | 711 }); |
711 }); | 712 }); |
712 } | 713 } |
OLD | NEW |