Index: pkg/front_end/lib/memory_file_system.dart |
diff --git a/pkg/front_end/lib/memory_file_system.dart b/pkg/front_end/lib/memory_file_system.dart |
index 267cbe36a6a7b038322a9e96189ce7b64ec80532..e7382adfb38a38d51b534894d9c7ce6de27d1a25 100644 |
--- a/pkg/front_end/lib/memory_file_system.dart |
+++ b/pkg/front_end/lib/memory_file_system.dart |
@@ -20,26 +20,29 @@ class MemoryFileSystem implements FileSystem { |
@override |
final p.Context context; |
- final Map<String, Uint8List> _files = {}; |
+ final Map<Uri, Uint8List> _files = {}; |
/// The "current directory" in the in-memory virtual file system. |
/// |
- /// This is used to convert relative paths to absolute paths. |
- String currentDirectory; |
- |
- MemoryFileSystem(this.context, this.currentDirectory); |
+ /// This is used to convert relative URIs to absolute URIs. |
+ /// |
+ /// Always ends in a trailing '/'. |
+ Uri currentDirectory; |
- @override |
- MemoryFileSystemEntity entityForPath(String path) => |
- new MemoryFileSystemEntity._( |
- this, context.normalize(context.join(currentDirectory, path))); |
+ MemoryFileSystem(this.context, Uri currentDirectory) |
+ : currentDirectory = _addTrailingSlash(currentDirectory); |
@override |
MemoryFileSystemEntity entityForUri(Uri uri) { |
- if (uri.scheme != 'file') throw new ArgumentError('File URI expected'); |
- // Note: we don't have to verify that the URI's path is absolute, because |
- // URIs with non-empty schemes always have absolute paths. |
- return entityForPath(context.fromUri(uri)); |
+ return new MemoryFileSystemEntity._( |
+ this, currentDirectory.resolveUri(uri).normalizePath()); |
+ } |
+ |
+ static Uri _addTrailingSlash(Uri uri) { |
+ if (!uri.path.endsWith('/')) { |
+ uri = uri.replace(path: uri.path + '/'); |
+ } |
+ return uri; |
} |
} |
@@ -49,22 +52,22 @@ class MemoryFileSystemEntity implements FileSystemEntity { |
final MemoryFileSystem _fileSystem; |
@override |
- final String path; |
+ final Uri uri; |
- MemoryFileSystemEntity._(this._fileSystem, this.path); |
+ MemoryFileSystemEntity._(this._fileSystem, this.uri); |
@override |
- int get hashCode => path.hashCode; |
+ int get hashCode => uri.hashCode; |
@override |
bool operator ==(Object other) => |
other is MemoryFileSystemEntity && |
- other.path == path && |
+ other.uri == uri && |
identical(other._fileSystem, _fileSystem); |
@override |
Future<List<int>> readAsBytes() async { |
- List<int> contents = _fileSystem._files[path]; |
+ List<int> contents = _fileSystem._files[uri]; |
if (contents != null) { |
return contents.toList(); |
} |
@@ -82,7 +85,7 @@ class MemoryFileSystemEntity implements FileSystemEntity { |
/// If no file exists, one is created. If a file exists already, it is |
/// overwritten. |
void writeAsBytesSync(List<int> bytes) { |
- _fileSystem._files[path] = new Uint8List.fromList(bytes); |
+ _fileSystem._files[uri] = new Uint8List.fromList(bytes); |
} |
/// Writes the given string to this file system entity. |
@@ -95,6 +98,6 @@ class MemoryFileSystemEntity implements FileSystemEntity { |
// Note: the return type of UTF8.encode is List<int>, but in practice it |
// always returns Uint8List. We rely on that for efficiency, so that we |
// don't have to make an extra copy. |
- _fileSystem._files[path] = UTF8.encode(s) as Uint8List; |
+ _fileSystem._files[uri] = UTF8.encode(s) as Uint8List; |
} |
} |