| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 /// API for compiling Dart source code to .dill (Kernel IR) files. | 5 /// API for compiling Dart source code to .dill (Kernel IR) files. |
| 6 library front_end.vm; | 6 library front_end.vm; |
| 7 // TODO(ahe): Convert this file to use the API in `../../kernel_generator.dart` | 7 // TODO(ahe): Convert this file to use the API in `../../kernel_generator.dart` |
| 8 // and `../../compiler_options.dart`. | 8 // and `../../compiler_options.dart`. |
| 9 | 9 |
| 10 import 'dart:async' show Future; | 10 import 'dart:async' show Future; |
| 11 | 11 |
| 12 import 'dart:io' show File, Platform; | 12 import 'dart:io' show File, Platform; |
| 13 | 13 |
| 14 import 'dart:typed_data' show Uint8List; | 14 import 'dart:typed_data' show Uint8List; |
| 15 | 15 |
| 16 import 'package:front_end/physical_file_system.dart'; |
| 17 |
| 16 import 'fasta.dart' as fasta; | 18 import 'fasta.dart' as fasta; |
| 17 | 19 |
| 18 /// Compilation status codes. | 20 /// Compilation status codes. |
| 19 /// | 21 /// |
| 20 /// Note: The [index] property of these constants must match | 22 /// Note: The [index] property of these constants must match |
| 21 /// `Dart_KernelCompilationStatus` in | 23 /// `Dart_KernelCompilationStatus` in |
| 22 /// [dart_api.h](../../../../runtime/include/dart_api.h). | 24 /// [dart_api.h](../../../../runtime/include/dart_api.h). |
| 23 enum Status { | 25 enum Status { |
| 24 /// Compilation was successful. | 26 /// Compilation was successful. |
| 25 ok, | 27 ok, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 47 | 49 |
| 48 Status get status; | 50 Status get status; |
| 49 | 51 |
| 50 get payload; | 52 get payload; |
| 51 | 53 |
| 52 List toResponse() => [status.index, payload]; | 54 List toResponse() => [status.index, payload]; |
| 53 } | 55 } |
| 54 | 56 |
| 55 Future<CompilationResult> parseScript(Uri script, | 57 Future<CompilationResult> parseScript(Uri script, |
| 56 {bool verbose: false, bool strongMode: false}) async { | 58 {bool verbose: false, bool strongMode: false}) async { |
| 59 return parseScriptInFileSystem(script, PhysicalFileSystem.instance, |
| 60 verbose: verbose, strongMode: strongMode); |
| 61 } |
| 62 |
| 63 Future<CompilationResult> parseScriptInFileSystem( |
| 64 Uri script, FileSystem fileSystem, |
| 65 {bool verbose: false, bool strongMode: false}) async { |
| 57 final Uri packagesUri = (Platform.packageConfig != null) | 66 final Uri packagesUri = (Platform.packageConfig != null) |
| 58 ? Uri.parse(Platform.packageConfig) | 67 ? Uri.parse(Platform.packageConfig) |
| 59 : await _findPackagesFile(script); | 68 : await _findPackagesFile(fileSystem, script); |
| 60 if (packagesUri == null) { | 69 if (packagesUri == null) { |
| 61 throw "Could not find .packages"; | 70 throw "Could not find .packages"; |
| 62 } | 71 } |
| 63 | 72 |
| 64 final Uri patchedSdk = Uri.base | 73 final Uri patchedSdk = Uri.base |
| 65 .resolveUri(new Uri.file(Platform.resolvedExecutable)) | 74 .resolveUri(new Uri.file(Platform.resolvedExecutable)) |
| 66 .resolveUri(new Uri.directory("patched_sdk")); | 75 .resolveUri(new Uri.directory("patched_sdk")); |
| 67 | 76 |
| 68 if (verbose) { | 77 if (verbose) { |
| 69 print("""DFE: Requesting compilation { | 78 print("""DFE: Requesting compilation { |
| 70 scriptUri: ${script} | 79 scriptUri: ${script} |
| 71 packagesUri: ${packagesUri} | 80 packagesUri: ${packagesUri} |
| 72 patchedSdk: ${patchedSdk} | 81 patchedSdk: ${patchedSdk} |
| 73 }"""); | 82 }"""); |
| 74 } | 83 } |
| 75 | 84 |
| 76 try { | 85 try { |
| 77 return await fasta.parseScript(script, packagesUri, patchedSdk, | 86 return await fasta.parseScriptInFileSystem( |
| 87 script, fileSystem, packagesUri, patchedSdk, |
| 78 verbose: verbose, strongMode: strongMode); | 88 verbose: verbose, strongMode: strongMode); |
| 79 } catch (err, stack) { | 89 } catch (err, stack) { |
| 80 return new CompilationResult.crash(err, stack); | 90 return new CompilationResult.crash(err, stack); |
| 81 } | 91 } |
| 82 } | 92 } |
| 83 | 93 |
| 84 class _CompilationOk extends CompilationResult { | 94 class _CompilationOk extends CompilationResult { |
| 85 final Uint8List bytes; | 95 final Uint8List bytes; |
| 86 | 96 |
| 87 _CompilationOk(this.bytes) : super._(); | 97 _CompilationOk(this.bytes) : super._(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 Status get status => Status.crash; | 138 Status get status => Status.crash; |
| 129 | 139 |
| 130 @override | 140 @override |
| 131 String get errorString => "${exception}\n${stack}"; | 141 String get errorString => "${exception}\n${stack}"; |
| 132 | 142 |
| 133 String toString() => "_CompilationCrash(${errorString})"; | 143 String toString() => "_CompilationCrash(${errorString})"; |
| 134 } | 144 } |
| 135 | 145 |
| 136 /// This duplicates functionality from the Loader which we can't easily | 146 /// This duplicates functionality from the Loader which we can't easily |
| 137 /// access from here. | 147 /// access from here. |
| 138 Future<Uri> _findPackagesFile(Uri base) async { | 148 Future<Uri> _findPackagesFile(FileSystem fileSystem, Uri base) async { |
| 139 var dir = new File.fromUri(base).parent; | 149 var dir = new File.fromUri(base).parent; |
| 140 while (true) { | 150 while (true) { |
| 141 final packagesFile = dir.uri.resolve(".packages"); | 151 final packagesFile = dir.uri.resolve(".packages"); |
| 142 if (await new File.fromUri(packagesFile).exists()) { | 152 if (await fileSystem.entityForUri(packagesFile).exists()) { |
| 143 return packagesFile; | 153 return packagesFile; |
| 144 } | 154 } |
| 145 if (dir.parent.path == dir.path) { | 155 if (dir.parent.path == dir.path) { |
| 146 break; | 156 break; |
| 147 } | 157 } |
| 148 dir = dir.parent; | 158 dir = dir.parent; |
| 149 } | 159 } |
| 150 return null; | 160 return null; |
| 151 } | 161 } |
| OLD | NEW |