Chromium Code Reviews| Index: pkg/front_end/lib/src/fasta/source/source_loader.dart |
| diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart |
| index 699ab43c7728fe42a10d9434ea3c54604510decc..c538715b36d4bf56c3f23e2e41b8cbcdbf175900 100644 |
| --- a/pkg/front_end/lib/src/fasta/source/source_loader.dart |
| +++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart |
| @@ -6,8 +6,10 @@ library fasta.source_loader; |
| import 'dart:async' show Future; |
| +import 'dart:io'; |
| import 'dart:typed_data' show Uint8List; |
| +import 'package:front_end/file_system.dart'; |
| import 'package:front_end/src/base/instrumentation.dart' show Instrumentation; |
| import 'package:front_end/src/fasta/builder/ast_factory.dart' show AstFactory; |
| @@ -44,8 +46,6 @@ import '../parser/class_member_parser.dart' show ClassMemberParser; |
| import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan; |
| -import '../io.dart' show readBytesFromFile; |
| - |
| import 'diet_listener.dart' show DietListener; |
| import 'diet_parser.dart' show DietParser; |
| @@ -57,6 +57,9 @@ import 'source_class_builder.dart' show SourceClassBuilder; |
| import 'source_library_builder.dart' show SourceLibraryBuilder; |
| class SourceLoader<L> extends Loader<L> { |
| + /// The [FileSystem] which should be used to access files. |
| + final FileSystem fileSystem; |
| + |
| final Map<Uri, List<int>> sourceBytes = <Uri, List<int>>{}; |
| final bool excludeSource = CompilerContext.current.options.excludeSource; |
| @@ -70,7 +73,7 @@ class SourceLoader<L> extends Loader<L> { |
| Instrumentation instrumentation; |
| - SourceLoader(KernelTarget target) : super(target); |
| + SourceLoader(this.fileSystem, KernelTarget target) : super(target); |
| Future<Token> tokenize(SourceLibraryBuilder library, |
| {bool suppressLexicalErrors: false}) async { |
| @@ -78,10 +81,27 @@ class SourceLoader<L> extends Loader<L> { |
| if (uri == null || uri.scheme != "file") { |
| return inputError(library.uri, -1, "Not found: ${library.uri}."); |
| } |
| + |
| + // Get the library text from the cache, or read from the file system. |
| List<int> bytes = sourceBytes[uri]; |
| if (bytes == null) { |
| - bytes = sourceBytes[uri] = await readBytesFromFile(uri); |
| + try { |
| + List<int> rawBytes = await fileSystem.entityForUri(uri).readAsBytes(); |
| + Uint8List zeroTerminatedBytes = new Uint8List(rawBytes.length + 1); |
| + zeroTerminatedBytes.setRange(0, rawBytes.length, rawBytes); |
|
ahe
2017/05/08 10:06:14
I'd appreciate if we can roll this back until the
Siggi Cherem (dart-lang)
2017/05/08 16:38:22
Another option: instead of adding an API to read i
scheglov
2017/05/08 16:53:36
Well, we could do this.
OTOH API bloating is not n
|
| + bytes = zeroTerminatedBytes; |
| + sourceBytes[uri] = bytes; |
| + } on FileSystemException catch (e) { |
| + // TODO(scheglov) Throw and catch abstract file-system exceptions. |
| + String message = e.message; |
| + String osMessage = e.osError?.message; |
| + if (osMessage != null && osMessage.isNotEmpty) { |
| + message = osMessage; |
| + } |
| + return inputError(uri, -1, message); |
| + } |
| } |
| + |
| byteCount += bytes.length - 1; |
| ScannerResult result = scan(bytes); |
| Token token = result.tokens; |