Index: utils/kernel-service/kernel-service.dart |
diff --git a/utils/kernel-service/kernel-service.dart b/utils/kernel-service/kernel-service.dart |
index dc7dacabe82cd00697b06f50019202a0061e7eb2..0e989dbba83602280c414e41e86ff5d1ef526ec2 100644 |
--- a/utils/kernel-service/kernel-service.dart |
+++ b/utils/kernel-service/kernel-service.dart |
@@ -21,7 +21,7 @@ |
library runtime.tools.kernel_service; |
import 'dart:async'; |
-import 'dart:io'; |
+import 'dart:io' hide FileSystemEntity; |
import 'dart:isolate'; |
import 'package:front_end/file_system.dart'; |
@@ -69,7 +69,7 @@ Future _processLoadRequest(request) async { |
final SendPort port = request[1]; |
final String inputFileUrl = request[2]; |
FileSystem fileSystem = request.length > 3 |
- ? _buildMemoryFileSystem(request[3]) |
+ ? _buildFileSystem(request[3]) |
: PhysicalFileSystem.instance; |
CompilationResult result; |
@@ -97,18 +97,63 @@ Future _processLoadRequest(request) async { |
} |
} |
-// Given namedSources list of interleaved file name string and |
-// raw file content Uint8List this function builds up and returns |
-// MemoryFileSystem instance that can be used instead of |
-// PhysicalFileSystem.instance by the frontend. |
-MemoryFileSystem _buildMemoryFileSystem(List namedSources) { |
+/// Creates a file system containing the files specified in [namedSources] and |
+/// that delegates to the underlying file system for any other file request. |
+/// The [namedSources] list interleaves file name string and |
+/// raw file content Uint8List. |
+/// |
+/// The result can be used instead of PhysicalFileSystem.instance by the |
+/// frontend. |
+FileSystem _buildFileSystem(List namedSources) { |
MemoryFileSystem fileSystem = new MemoryFileSystem(Uri.parse('file:///')); |
for (int i = 0; i < namedSources.length ~/ 2; i++) { |
fileSystem |
.entityForUri(Uri.parse(namedSources[i * 2])) |
.writeAsBytesSync(namedSources[i * 2 + 1]); |
} |
- return fileSystem; |
+ return new HybridFileSystem(fileSystem); |
+} |
+ |
+/// A file system that mixes files from memory and a physical file system. All |
+/// memory entities take priotity over file system entities. |
+class HybridFileSystem implements FileSystem { |
+ final MemoryFileSystem memory; |
+ final PhysicalFileSystem physical = PhysicalFileSystem.instance; |
+ |
+ HybridFileSystem(this.memory); |
+ |
+ @override |
+ FileSystemEntity entityForUri(Uri uri) => new HybridFileSystemEntity( |
+ memory.entityForUri(uri), physical.entityForUri(uri)); |
+} |
+ |
+/// Entity that delegates to an underlying memory or phisical file system |
+/// entity. |
+class HybridFileSystemEntity implements FileSystemEntity { |
+ final FileSystemEntity memory; |
+ final FileSystemEntity physical; |
+ |
+ HybridFileSystemEntity(this.memory, this.physical); |
+ |
+ FileSystemEntity _delegate; |
+ Future<FileSystemEntity> get delegate async { |
+ return _delegate ??= (await memory.exists()) ? memory : physical; |
+ } |
+ |
+ @override |
+ Uri get uri => memory.uri; |
+ |
+ @override |
+ Future<bool> exists() async => (await delegate).exists(); |
+ |
+ @override |
+ Future<DateTime> lastModified() async => (await delegate).lastModified(); |
+ |
+ @override |
+ Future<List<int>> readAsBytes() async => (await delegate).readAsBytes(); |
+ |
+ @override |
+ Future<String> readAsString() async => (await delegate).readAsString(); |
} |
train(String scriptUri) { |