Index: sdk/lib/_internal/compiler/implementation/source_file_provider.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart |
index 352f03cea24d463cddb793d777128818c793c94c..d1ae32252876e7293220a15c9492e35d89c81b0c 100644 |
--- a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart |
+++ b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart |
@@ -14,27 +14,33 @@ import 'colors.dart' as colors; |
import 'source_file.dart'; |
import 'filenames.dart'; |
import 'util/uri_extras.dart'; |
+import 'dart:typed_data'; |
-String readAll(String filename) { |
+List<int> readAll(String filename) { |
var file = (new File(filename)).openSync(); |
var length = file.lengthSync(); |
- var buffer = new List<int>(length); |
+ // +1 to have a 0 terminated list, see [Scanner]. |
+ var buffer = new Uint8List(length + 1); |
var bytes = file.readIntoSync(buffer, 0, length); |
file.closeSync(); |
- return UTF8.decode(buffer); |
+ return buffer; |
} |
-class SourceFileProvider { |
+abstract class SourceFileProvider { |
bool isWindows = (Platform.operatingSystem == 'windows'); |
Uri cwd = currentDirectory; |
Map<String, SourceFile> sourceFiles = <String, SourceFile>{}; |
int dartCharactersRead = 0; |
Future<String> readStringFromUri(Uri resourceUri) { |
+ return readUtf8BytesFromUri(resourceUri).then(UTF8.decode); |
+ } |
+ |
+ Future<List<int>> readUtf8BytesFromUri(Uri resourceUri) { |
if (resourceUri.scheme != 'file') { |
throw new ArgumentError("Unknown scheme in uri '$resourceUri'"); |
} |
- String source; |
+ List<int> source; |
try { |
source = readAll(uriPathToNative(resourceUri.path)); |
} on FileException catch (ex) { |
@@ -43,12 +49,16 @@ class SourceFileProvider { |
"(${ex.osError})"); |
} |
dartCharactersRead += source.length; |
- sourceFiles[resourceUri.toString()] = new SourceFile( |
+ sourceFiles[resourceUri.toString()] = new Utf8BytesSourceFile( |
relativize(cwd, resourceUri, isWindows), source); |
return new Future.value(source); |
} |
- Future<String> call(Uri resourceUri) => readStringFromUri(resourceUri); |
+ Future/*<List<int> | String>*/ call(Uri resourceUri); |
+} |
+ |
+class CompilerSourceFileProvider extends SourceFileProvider { |
+ Future<List<int>> call(Uri resourceUri) => readUtf8BytesFromUri(resourceUri); |
} |
class FormattingDiagnosticHandler { |
@@ -67,7 +77,7 @@ class FormattingDiagnosticHandler { |
FormattingDiagnosticHandler([SourceFileProvider provider]) |
: this.provider = |
- (provider == null) ? new SourceFileProvider() : provider; |
+ (provider == null) ? new CompilerSourceFileProvider() : provider; |
void info(var message, [api.Diagnostic kind = api.Diagnostic.VERBOSE_INFO]) { |
if (!verbose && kind == api.Diagnostic.VERBOSE_INFO) return; |