| #!/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. |
| |
| @JS() |
| library dev_compiler.web.main; |
| |
| import 'dart:async'; |
| |
| import 'package:args/command_runner.dart'; |
| import 'package:js/js.dart'; |
| |
| import 'web_command.dart'; |
| |
| @JS(r'$setUpDartDevCompilerInBrowser') |
| external set setUpCompilerInBrowser(Function function); |
| |
| Future<dynamic> _setUpCompilerInBrowser; |
| main() { |
| var args = ['compile']; |
| |
| // Avoid race condition when users try to call $setUpDartDevCompilerInBrowser |
| // before it is ready by installing the method immediately and making the body |
| // of the method async. |
| setUpCompilerInBrowser = allowInterop((String sdkUrl, |
| JSMap<String, String> summaryMap, |
| Function onCompileReady, |
| Function onError, |
| [Function onProgress]) async { |
| (await _setUpCompilerInBrowser)( |
| sdkUrl, summaryMap, onCompileReady, onError, onProgress); |
| }); |
| _runCommand(args); |
| } |
| |
| /// Runs a single compile command, and returns an exit code. |
| _runCommand(List<String> args, {MessageHandler messageHandler}) { |
| try { |
| // TODO: Remove CommandRunner and args if possible. May run into issues |
| // with ArgResults or ArgParsers. |
| var runner = CommandRunner('dartdevc', 'Dart Development Compiler'); |
| runner.addCommand(WebCompileCommand(messageHandler: messageHandler)); |
| _setUpCompilerInBrowser = runner.run(args); |
| } catch (e, s) { |
| _handleError(e, s, args, messageHandler: messageHandler); |
| } |
| } |
| |
| /// Handles [error] in a uniform fashion. Calls [messageHandler] with messages. |
| _handleError(dynamic error, dynamic stackTrace, List<String> args, |
| {MessageHandler messageHandler}) { |
| messageHandler ??= print; |
| |
| if (error is UsageException) { |
| // Incorrect usage, input file not found, etc. |
| messageHandler(error); |
| } else if (error is CompileErrorException) { |
| // Code has error(s) and failed to compile. |
| messageHandler(error); |
| } else { |
| // Anything else is likely a compiler bug. |
| // |
| // --unsafe-force-compile is a bit of a grey area, but it's nice not to |
| // crash while compiling |
| // (of course, output code may crash, if it had errors). |
| // |
| messageHandler(""); |
| messageHandler("We're sorry, you've found a bug in our compiler."); |
| messageHandler("You can report this bug at:"); |
| messageHandler( |
| " https://github.com/dart-lang/sdk/issues/labels/area-dev-compiler"); |
| messageHandler(""); |
| messageHandler( |
| "Please include the information below in your report, along with"); |
| messageHandler( |
| "any other information that may help us track it down. Thanks!"); |
| messageHandler(""); |
| messageHandler(" dartdevc arguments: " + args.join(' ')); |
| messageHandler(""); |
| messageHandler("```"); |
| messageHandler(error); |
| messageHandler(stackTrace); |
| messageHandler("```"); |
| } |
| } |