| // Copyright (c) 2017, 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. | |
| /// Helper classes and methods to adapt between `package:compiler` and | |
| /// `package:front_end` APIs. | |
| library compiler.kernel.front_end_adapter; | |
| import 'dart:async'; | |
| import 'package:front_end/src/api_prototype/front_end.dart' as fe; | |
| import '../../compiler_new.dart' as api; | |
| import '../common.dart'; | |
| import '../io/source_file.dart'; | |
| /// A front-ends's [FileSystem] that uses dart2js's [api.CompilerInput]. | |
| class CompilerFileSystem implements fe.FileSystem { | |
| final api.CompilerInput inputProvider; | |
| CompilerFileSystem(this.inputProvider); | |
| @override | |
| fe.FileSystemEntity entityForUri(Uri uri) => | |
| new _CompilerFileSystemEntity(uri, this); | |
| } | |
| class _CompilerFileSystemEntity implements fe.FileSystemEntity { | |
| final Uri uri; | |
| final CompilerFileSystem fs; | |
| _CompilerFileSystemEntity(this.uri, this.fs); | |
| @override | |
| Future<String> readAsString() async { | |
| api.Input input; | |
| try { | |
| input = await fs.inputProvider | |
| .readFromUri(uri, inputKind: api.InputKind.UTF8); | |
| } catch (e) { | |
| throw new fe.FileSystemException(uri, '$e'); | |
| } | |
| if (input == null) throw new fe.FileSystemException(uri, "File not found"); | |
| // TODO(sigmund): technically someone could provide dart2js with an input | |
| // that is not a SourceFile. Note that this assumption is also done in the | |
| // (non-kernel) ScriptLoader. | |
| SourceFile file = input as SourceFile; | |
| return file.slowText(); | |
| } | |
| @override | |
| Future<List<int>> readAsBytes() async { | |
| api.Input input; | |
| try { | |
| input = await fs.inputProvider | |
| .readFromUri(uri, inputKind: api.InputKind.binary); | |
| } catch (e) { | |
| throw new fe.FileSystemException(uri, '$e'); | |
| } | |
| if (input == null) throw new fe.FileSystemException(uri, "File not found"); | |
| return input.data; | |
| } | |
| @override | |
| Future<bool> exists() async { | |
| try { | |
| api.Input input = await fs.inputProvider | |
| .readFromUri(uri, inputKind: api.InputKind.binary); | |
| return input != null; | |
| } catch (e) { | |
| return false; | |
| } | |
| } | |
| } | |
| /// Report a [message] received from the front-end, using dart2js's | |
| /// [DiagnosticReporter]. | |
| void reportFrontEndMessage( | |
| DiagnosticReporter reporter, fe.CompilationMessage message) { | |
| MessageKind kind = MessageKind.GENERIC; | |
| Spannable span; | |
| if (message.span != null) { | |
| span = new SourceSpan(message.span.start.sourceUrl, | |
| message.span.start.offset, message.span.end.offset); | |
| } else { | |
| span = NO_LOCATION_SPANNABLE; | |
| } | |
| switch (message.severity) { | |
| case fe.Severity.internalProblem: | |
| throw message.message; | |
| case fe.Severity.error: | |
| reporter.reportErrorMessage(span, kind, {'text': message.message}); | |
| break; | |
| case fe.Severity.warning: | |
| reporter.reportWarningMessage(span, kind, {'text': message.message}); | |
| break; | |
| case fe.Severity.context: | |
| reporter.reportInfo(span, kind, {'text': message.message}); | |
| break; | |
| default: | |
| throw new UnimplementedError('unhandled severity ${message.severity}'); | |
| } | |
| } |