| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 fasta.outline; | 5 library fasta.outline; |
| 6 | 6 |
| 7 import 'dart:async' show | 7 import 'dart:async' show |
| 8 Future; | 8 Future; |
| 9 | 9 |
| 10 import 'dart:io' show | 10 import 'dart:io' show |
| 11 exitCode; | 11 exitCode; |
| 12 | 12 |
| 13 import 'package:kernel/verifier.dart' show | 13 import 'package:kernel/verifier.dart' show |
| 14 verifyProgram; | 14 verifyProgram; |
| 15 | 15 |
| 16 import 'compiler_command_line.dart' show | 16 import 'compiler_command_line.dart' show |
| 17 CompilerCommandLine; | 17 CompilerCommandLine; |
| 18 | 18 |
| 19 import 'compiler_context.dart' show |
| 20 CompilerContext; |
| 21 |
| 19 import 'errors.dart' show | 22 import 'errors.dart' show |
| 20 InputError, | 23 InputError, |
| 21 inputError; | 24 inputError; |
| 22 | 25 |
| 23 import 'kernel/kernel_target.dart' show | 26 import 'kernel/kernel_target.dart' show |
| 24 KernelTarget; | 27 KernelTarget; |
| 25 | 28 |
| 26 import 'dill/dill_target.dart' show | 29 import 'dill/dill_target.dart' show |
| 27 DillTarget; | 30 DillTarget; |
| 28 | 31 |
| 29 import 'ticker.dart' show | 32 import 'ticker.dart' show |
| 30 Ticker; | 33 Ticker; |
| 31 | 34 |
| 32 import 'translate_uri.dart' show | 35 import 'translate_uri.dart' show |
| 33 TranslateUri; | 36 TranslateUri; |
| 34 | 37 |
| 35 import 'ast_kind.dart' show | 38 import 'ast_kind.dart' show |
| 36 AstKind; | 39 AstKind; |
| 37 | 40 |
| 38 // TODO(ahe): Remove this import. Instead make the SDK available as resource in | 41 // TODO(ahe): Remove this import. Instead make the SDK available as resource in |
| 39 // the executable, or something similar. | 42 // the executable, or something similar. |
| 40 import 'testing/kernel_chain.dart' show | 43 import 'testing/kernel_chain.dart' show |
| 41 computePatchedSdk; | 44 computePatchedSdk; |
| 42 | 45 |
| 43 CompilerCommandLine parseArguments(String programName, List<String> arguments) { | |
| 44 return new CompilerCommandLine(programName, arguments); | |
| 45 } | |
| 46 | |
| 47 Future<KernelTarget> outline(List<String> arguments) async { | 46 Future<KernelTarget> outline(List<String> arguments) async { |
| 48 try { | 47 try { |
| 49 CompilerCommandLine cl = parseArguments("outline", arguments); | 48 return await CompilerCommandLine.withGlobalOptions( |
| 50 if (cl.verbose) print("Building outlines for ${arguments.join(' ')}"); | 49 "outline", arguments, (CompilerContext c) async { |
| 51 return await doOutline(cl, new Ticker(isVerbose: cl.verbose), cl.output); | 50 if (c.options.verbose) { |
| 51 print("Building outlines for ${arguments.join(' ')}"); |
| 52 } |
| 53 return await doOutline(c, new Ticker(isVerbose: c.options.verbose), |
| 54 c.options.output); |
| 55 }); |
| 52 } on InputError catch (e) { | 56 } on InputError catch (e) { |
| 53 exitCode = 1; | 57 exitCode = 1; |
| 54 print(e.format()); | 58 print(e.format()); |
| 55 return null; | 59 return null; |
| 56 } | 60 } |
| 57 } | 61 } |
| 58 | 62 |
| 59 Future<Uri> compile(List<String> arguments) async { | 63 Future<Uri> compile(List<String> arguments) async { |
| 60 try { | 64 try { |
| 61 CompilerCommandLine cl = parseArguments("compile", arguments); | 65 return await CompilerCommandLine.withGlobalOptions( |
| 62 if (cl.verbose) { | 66 "compile", arguments, (CompilerContext c) async { |
| 63 print("Compiling directly to Kernel: ${arguments.join(' ')}"); | 67 if (c.options.verbose) { |
| 64 } | 68 print("Compiling directly to Kernel: ${arguments.join(' ')}"); |
| 65 return | 69 } |
| 66 await doCompile(cl, new Ticker(isVerbose: cl.verbose), AstKind.Kernel); | 70 return await doCompile(c, new Ticker(isVerbose: c.options.verbose), |
| 71 AstKind.Kernel); |
| 72 }); |
| 67 } on InputError catch (e) { | 73 } on InputError catch (e) { |
| 68 exitCode = 1; | 74 exitCode = 1; |
| 69 print(e.format()); | 75 print(e.format()); |
| 70 return null; | 76 return null; |
| 71 } | 77 } |
| 72 } | 78 } |
| 73 | 79 |
| 74 Future<Uri> kompile(List<String> arguments) async { | 80 Future<Uri> kompile(List<String> arguments) async { |
| 75 try { | 81 try { |
| 76 CompilerCommandLine cl = parseArguments("kompile", arguments); | 82 return await CompilerCommandLine.withGlobalOptions( |
| 77 if (cl.verbose) print("Compiling via analyzer: ${arguments.join(' ')}"); | 83 "kompile", arguments, (CompilerContext c) async { |
| 78 return await doCompile( | 84 if (c.options.verbose) { |
| 79 cl, new Ticker(isVerbose: cl.verbose), AstKind.Analyzer); | 85 print("Compiling via analyzer: ${arguments.join(' ')}"); |
| 86 } |
| 87 return await doCompile(c, new Ticker(isVerbose: c.options.verbose), |
| 88 AstKind.Analyzer); |
| 89 }); |
| 80 } on InputError catch (e) { | 90 } on InputError catch (e) { |
| 81 exitCode = 1; | 91 exitCode = 1; |
| 82 print(e.format()); | 92 print(e.format()); |
| 83 return null; | 93 return null; |
| 84 } | 94 } |
| 85 } | 95 } |
| 86 | 96 |
| 87 Future<KernelTarget> doOutline(CompilerCommandLine cl, Ticker ticker, | 97 Future<KernelTarget> doOutline(CompilerContext c, Ticker ticker, |
| 88 [Uri output]) async { | 98 [Uri output]) async { |
| 89 Uri sdk = await computePatchedSdk(); | 99 Uri sdk = await computePatchedSdk(); |
| 90 ticker.logMs("Found patched SDK"); | 100 ticker.logMs("Found patched SDK"); |
| 91 TranslateUri uriTranslator = await TranslateUri.parse(sdk); | 101 TranslateUri uriTranslator = await TranslateUri.parse(sdk); |
| 92 ticker.logMs("Read packages file"); | 102 ticker.logMs("Read packages file"); |
| 93 DillTarget dillTarget = new DillTarget(ticker, uriTranslator); | 103 DillTarget dillTarget = new DillTarget(ticker, uriTranslator); |
| 94 KernelTarget kernelTarget = new KernelTarget(dillTarget, uriTranslator); | 104 KernelTarget kernelTarget = |
| 95 Uri platform = cl.platform; | 105 new KernelTarget(dillTarget, uriTranslator, c.uriToSource); |
| 106 Uri platform = c.options.platform; |
| 96 if (platform != null) { | 107 if (platform != null) { |
| 97 dillTarget.read(platform); | 108 dillTarget.read(platform); |
| 98 } | 109 } |
| 99 String argument = cl.arguments.first; | 110 String argument = c.options.arguments.first; |
| 100 Uri uri = Uri.base.resolve(argument); | 111 Uri uri = Uri.base.resolve(argument); |
| 101 String path = uriTranslator.translate(uri)?.path ?? argument; | 112 String path = uriTranslator.translate(uri)?.path ?? argument; |
| 102 if (path.endsWith(".dart")) { | 113 if (path.endsWith(".dart")) { |
| 103 kernelTarget.read(uri); | 114 kernelTarget.read(uri); |
| 104 } else { | 115 } else { |
| 105 inputError(uri, -1, "Unexpected input: $uri"); | 116 inputError(uri, -1, "Unexpected input: $uri"); |
| 106 } | 117 } |
| 107 await dillTarget.writeOutline(null); | 118 await dillTarget.writeOutline(null); |
| 108 await kernelTarget.writeOutline(output); | 119 await kernelTarget.writeOutline(output); |
| 109 if (cl.dumpIr && output != null) { | 120 if (c.options.dumpIr && output != null) { |
| 110 kernelTarget.dumpIr(); | 121 kernelTarget.dumpIr(); |
| 111 } | 122 } |
| 112 return kernelTarget; | 123 return kernelTarget; |
| 113 } | 124 } |
| 114 | 125 |
| 115 Future<Uri> doCompile(CompilerCommandLine cl, Ticker ticker, | 126 Future<Uri> doCompile(CompilerContext c, Ticker ticker, AstKind kind) async { |
| 116 AstKind kind) async { | 127 KernelTarget kernelTarget = await doOutline(c, ticker); |
| 117 KernelTarget kernelTarget = await doOutline(cl, ticker); | |
| 118 if (exitCode != 0) return null; | 128 if (exitCode != 0) return null; |
| 119 Uri uri = cl.output; | 129 Uri uri = c.options.output; |
| 120 await kernelTarget.writeProgram(uri, kind); | 130 await kernelTarget.writeProgram(uri, kind); |
| 121 if (cl.dumpIr) { | 131 if (c.options.dumpIr) { |
| 122 kernelTarget.dumpIr(); | 132 kernelTarget.dumpIr(); |
| 123 } | 133 } |
| 124 if (cl.verify) { | 134 if (c.options.verify) { |
| 125 try { | 135 try { |
| 126 verifyProgram(kernelTarget.program); | 136 verifyProgram(kernelTarget.program); |
| 127 ticker.logMs("Verified program"); | 137 ticker.logMs("Verified program"); |
| 128 } catch (e, s) { | 138 } catch (e, s) { |
| 129 exitCode = 1; | 139 exitCode = 1; |
| 130 print("Verification of program failed: $e"); | 140 print("Verification of program failed: $e"); |
| 131 if (s != null && cl.verbose) { | 141 if (s != null && c.options.verbose) { |
| 132 print(s); | 142 print(s); |
| 133 } | 143 } |
| 134 } | 144 } |
| 135 } | 145 } |
| 136 return uri; | 146 return uri; |
| 137 } | 147 } |
| OLD | NEW |