Chromium Code Reviews| 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.source_loader; | 5 library fasta.source_loader; |
| 6 | 6 |
| 7 import 'dart:async' show Future; | 7 import 'dart:async' show Future; |
| 8 | 8 |
| 9 import 'dart:io'; | |
| 9 import 'dart:typed_data' show Uint8List; | 10 import 'dart:typed_data' show Uint8List; |
| 10 | 11 |
| 12 import 'package:front_end/file_system.dart'; | |
| 11 import 'package:front_end/src/base/instrumentation.dart' show Instrumentation; | 13 import 'package:front_end/src/base/instrumentation.dart' show Instrumentation; |
| 12 | 14 |
| 13 import 'package:front_end/src/fasta/builder/ast_factory.dart' show AstFactory; | 15 import 'package:front_end/src/fasta/builder/ast_factory.dart' show AstFactory; |
| 14 | 16 |
| 15 import 'package:front_end/src/fasta/kernel/kernel_ast_factory.dart' | 17 import 'package:front_end/src/fasta/kernel/kernel_ast_factory.dart' |
| 16 show KernelAstFactory; | 18 show KernelAstFactory; |
| 17 | 19 |
| 18 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' | 20 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' |
| 19 show KernelTypeInferenceEngine; | 21 show KernelTypeInferenceEngine; |
| 20 | 22 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 37 import '../errors.dart' show inputError; | 39 import '../errors.dart' show inputError; |
| 38 | 40 |
| 39 import '../export.dart' show Export; | 41 import '../export.dart' show Export; |
| 40 | 42 |
| 41 import '../loader.dart' show Loader; | 43 import '../loader.dart' show Loader; |
| 42 | 44 |
| 43 import '../parser/class_member_parser.dart' show ClassMemberParser; | 45 import '../parser/class_member_parser.dart' show ClassMemberParser; |
| 44 | 46 |
| 45 import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan; | 47 import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan; |
| 46 | 48 |
| 47 import '../io.dart' show readBytesFromFile; | |
| 48 | |
| 49 import 'diet_listener.dart' show DietListener; | 49 import 'diet_listener.dart' show DietListener; |
| 50 | 50 |
| 51 import 'diet_parser.dart' show DietParser; | 51 import 'diet_parser.dart' show DietParser; |
| 52 | 52 |
| 53 import 'outline_builder.dart' show OutlineBuilder; | 53 import 'outline_builder.dart' show OutlineBuilder; |
| 54 | 54 |
| 55 import 'source_class_builder.dart' show SourceClassBuilder; | 55 import 'source_class_builder.dart' show SourceClassBuilder; |
| 56 | 56 |
| 57 import 'source_library_builder.dart' show SourceLibraryBuilder; | 57 import 'source_library_builder.dart' show SourceLibraryBuilder; |
| 58 | 58 |
| 59 class SourceLoader<L> extends Loader<L> { | 59 class SourceLoader<L> extends Loader<L> { |
| 60 /// The [FileSystem] which should be used to access files. | |
| 61 final FileSystem fileSystem; | |
| 62 | |
| 60 final Map<Uri, List<int>> sourceBytes = <Uri, List<int>>{}; | 63 final Map<Uri, List<int>> sourceBytes = <Uri, List<int>>{}; |
| 61 final bool excludeSource = CompilerContext.current.options.excludeSource; | 64 final bool excludeSource = CompilerContext.current.options.excludeSource; |
| 62 | 65 |
| 63 // Used when building directly to kernel. | 66 // Used when building directly to kernel. |
| 64 ClassHierarchy hierarchy; | 67 ClassHierarchy hierarchy; |
| 65 CoreTypes coreTypes; | 68 CoreTypes coreTypes; |
| 66 | 69 |
| 67 final AstFactory astFactory = new KernelAstFactory(); | 70 final AstFactory astFactory = new KernelAstFactory(); |
| 68 | 71 |
| 69 TypeInferenceEngine typeInferenceEngine; | 72 TypeInferenceEngine typeInferenceEngine; |
| 70 | 73 |
| 71 Instrumentation instrumentation; | 74 Instrumentation instrumentation; |
| 72 | 75 |
| 73 SourceLoader(KernelTarget target) : super(target); | 76 SourceLoader(this.fileSystem, KernelTarget target) : super(target); |
| 74 | 77 |
| 75 Future<Token> tokenize(SourceLibraryBuilder library, | 78 Future<Token> tokenize(SourceLibraryBuilder library, |
| 76 {bool suppressLexicalErrors: false}) async { | 79 {bool suppressLexicalErrors: false}) async { |
| 77 Uri uri = library.fileUri; | 80 Uri uri = library.fileUri; |
| 78 if (uri == null || uri.scheme != "file") { | 81 if (uri == null || uri.scheme != "file") { |
| 79 return inputError(library.uri, -1, "Not found: ${library.uri}."); | 82 return inputError(library.uri, -1, "Not found: ${library.uri}."); |
| 80 } | 83 } |
| 84 | |
| 85 // Get the library text from the cache, or read from the file system. | |
| 81 List<int> bytes = sourceBytes[uri]; | 86 List<int> bytes = sourceBytes[uri]; |
| 82 if (bytes == null) { | 87 if (bytes == null) { |
| 83 bytes = sourceBytes[uri] = await readBytesFromFile(uri); | 88 try { |
| 89 List<int> rawBytes = await fileSystem.entityForUri(uri).readAsBytes(); | |
| 90 Uint8List zeroTerminatedBytes = new Uint8List(rawBytes.length + 1); | |
| 91 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
| |
| 92 bytes = zeroTerminatedBytes; | |
| 93 sourceBytes[uri] = bytes; | |
| 94 } on FileSystemException catch (e) { | |
| 95 // TODO(scheglov) Throw and catch abstract file-system exceptions. | |
| 96 String message = e.message; | |
| 97 String osMessage = e.osError?.message; | |
| 98 if (osMessage != null && osMessage.isNotEmpty) { | |
| 99 message = osMessage; | |
| 100 } | |
| 101 return inputError(uri, -1, message); | |
| 102 } | |
| 84 } | 103 } |
| 104 | |
| 85 byteCount += bytes.length - 1; | 105 byteCount += bytes.length - 1; |
| 86 ScannerResult result = scan(bytes); | 106 ScannerResult result = scan(bytes); |
| 87 Token token = result.tokens; | 107 Token token = result.tokens; |
| 88 if (!suppressLexicalErrors) { | 108 if (!suppressLexicalErrors) { |
| 89 List<int> source = getSource(bytes); | 109 List<int> source = getSource(bytes); |
| 90 target.addSourceInformation(library.fileUri, result.lineStarts, source); | 110 target.addSourceInformation(library.fileUri, result.lineStarts, source); |
| 91 } | 111 } |
| 92 while (token is ErrorToken) { | 112 while (token is ErrorToken) { |
| 93 if (!suppressLexicalErrors) { | 113 if (!suppressLexicalErrors) { |
| 94 ErrorToken error = token; | 114 ErrorToken error = token; |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 /// Performs the second phase of top level initializer inference, which is to | 420 /// Performs the second phase of top level initializer inference, which is to |
| 401 /// visit fields and top level variables in topologically-sorted order and | 421 /// visit fields and top level variables in topologically-sorted order and |
| 402 /// assign their types. | 422 /// assign their types. |
| 403 void performInitializerInference() { | 423 void performInitializerInference() { |
| 404 typeInferenceEngine.finishTopLevel(); | 424 typeInferenceEngine.finishTopLevel(); |
| 405 ticker.logMs("Performed initializer inference"); | 425 ticker.logMs("Performed initializer inference"); |
| 406 } | 426 } |
| 407 | 427 |
| 408 List<Uri> getDependencies() => sourceBytes.keys.toList(); | 428 List<Uri> getDependencies() => sourceBytes.keys.toList(); |
| 409 } | 429 } |
| OLD | NEW |