Index: pkg/front_end/lib/src/testing/hybrid_file_system.dart |
diff --git a/pkg/front_end/lib/src/testing/hybrid_file_system.dart b/pkg/front_end/lib/src/testing/hybrid_file_system.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e69d61d4dde2257e30691116ca9454862f693968 |
--- /dev/null |
+++ b/pkg/front_end/lib/src/testing/hybrid_file_system.dart |
@@ -0,0 +1,55 @@ |
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+/// A memory + physical file system used to mock input for tests but provide |
+/// sdk sources from disk. |
+library front_end.src.hybrid_file_system; |
+ |
+import 'dart:async'; |
+ |
+import 'package:front_end/file_system.dart'; |
+import 'package:front_end/memory_file_system.dart'; |
+import 'package:front_end/physical_file_system.dart'; |
+ |
+/// 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(); |
+} |