OLD | NEW |
(Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 /// Helper classes and methods to adapt between `package:compiler` and |
| 6 /// `package:front_end` APIs. |
| 7 library compiler.kernel.front_end_adapter; |
| 8 |
| 9 import 'dart:async'; |
| 10 |
| 11 import 'package:front_end/front_end.dart' as fe; |
| 12 |
| 13 import '../../compiler_new.dart' as api; |
| 14 |
| 15 import '../common.dart'; |
| 16 import '../io/source_file.dart'; |
| 17 |
| 18 /// A front-ends's [FileSystem] that uses dart2js's [api.CompilerInput]. |
| 19 class CompilerFileSystem implements fe.FileSystem { |
| 20 final api.CompilerInput inputProvider; |
| 21 |
| 22 CompilerFileSystem(this.inputProvider); |
| 23 |
| 24 @override |
| 25 fe.FileSystemEntity entityForUri(Uri uri) => |
| 26 new _CompilerFileSystemEntity(uri, this); |
| 27 } |
| 28 |
| 29 class _CompilerFileSystemEntity implements fe.FileSystemEntity { |
| 30 final Uri uri; |
| 31 final CompilerFileSystem fs; |
| 32 |
| 33 _CompilerFileSystemEntity(this.uri, this.fs); |
| 34 |
| 35 @override |
| 36 Future<String> readAsString() async { |
| 37 api.Input input; |
| 38 try { |
| 39 input = await fs.inputProvider |
| 40 .readFromUri(uri, inputKind: api.InputKind.utf8); |
| 41 } catch (e) { |
| 42 throw new fe.FileSystemException(uri, '$e'); |
| 43 } |
| 44 if (input == null) throw new fe.FileSystemException(uri, "File not found"); |
| 45 // TODO(sigmund): technically someone could provide dart2js with an input |
| 46 // that is not a SourceFile. Note that this assumption is also done in the |
| 47 // (non-kernel) ScriptLoader. |
| 48 SourceFile file = input as SourceFile; |
| 49 return file.slowText(); |
| 50 } |
| 51 |
| 52 @override |
| 53 Future<List<int>> readAsBytes() async { |
| 54 api.Input input; |
| 55 try { |
| 56 input = await fs.inputProvider |
| 57 .readFromUri(uri, inputKind: api.InputKind.binary); |
| 58 } catch (e) { |
| 59 throw new fe.FileSystemException(uri, '$e'); |
| 60 } |
| 61 if (input == null) throw new fe.FileSystemException(uri, "File not found"); |
| 62 return input.data; |
| 63 } |
| 64 |
| 65 @override |
| 66 Future<bool> exists() async { |
| 67 try { |
| 68 api.Input input = await fs.inputProvider |
| 69 .readFromUri(uri, inputKind: api.InputKind.binary); |
| 70 return input != null; |
| 71 } catch (e) { |
| 72 return false; |
| 73 } |
| 74 } |
| 75 } |
| 76 |
| 77 /// Report a [message] received from the front-end, using dart2js's |
| 78 /// [DiagnosticReporter]. |
| 79 void reportFrontEndMessage( |
| 80 DiagnosticReporter reporter, fe.CompilationMessage message) { |
| 81 // TODO(sigmund): translate message kinds using message.dart2jsCode |
| 82 MessageKind kind = MessageKind.GENERIC; |
| 83 switch (message.severity) { |
| 84 case fe.Severity.error: |
| 85 case fe.Severity.internalProblem: |
| 86 reporter.reportErrorMessage( |
| 87 NO_LOCATION_SPANNABLE, kind, {'text': message.message}); |
| 88 break; |
| 89 case fe.Severity.warning: |
| 90 reporter.reportWarningMessage( |
| 91 NO_LOCATION_SPANNABLE, kind, {'text': message.message}); |
| 92 break; |
| 93 case fe.Severity.nit: |
| 94 reporter.reportHintMessage( |
| 95 NO_LOCATION_SPANNABLE, kind, {'text': message.message}); |
| 96 break; |
| 97 default: |
| 98 throw new UnimplementedError('unhandled severity ${message.severity}'); |
| 99 } |
| 100 } |
OLD | NEW |