Chromium Code Reviews| 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 |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f3e10144d3fa63f357fabbc36b9d4890feae719d |
| --- /dev/null |
| +++ b/pkg/front_end/lib/memory_file_system.dart |
| @@ -0,0 +1,93 @@ |
| +// Copyright (c) 2016, 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. |
| + |
| +library front_end.memory_file_system; |
| + |
| +import 'dart:async'; |
| +import 'dart:convert'; |
| +import 'dart:typed_data'; |
| + |
| +import 'package:path/path.dart' as p; |
| + |
| +import 'file_system.dart'; |
| + |
| +/// Concrete implementation of [FileSystem] which performs its operations on an |
| +/// in-memory virtual file system. |
| +/// |
| +/// Not intended to be implemented or extended by clients. |
| +class MemoryFileSystem implements FileSystem { |
| + @override |
| + final p.Context context; |
| + |
| + final Map<String, 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); |
| + |
| + @override |
| + MemoryFileSystemEntity entityForPath(String path) => |
| + new MemoryFileSystemEntity._( |
| + this, context.normalize(context.join(currentDirectory, path))); |
| + |
| + @override |
| + MemoryFileSystemEntity entityForUri(Uri uri) { |
| + if (uri.scheme != 'file') throw new ArgumentError('File URI expected'); |
|
scheglov
2016/11/03 02:15:24
Do we want to check (or TODO) that uri is absolute
Paul Berry
2016/11/03 15:16:41
AFAICT, the scheme check is sufficient--it's impos
|
| + return entityForPath(context.fromUri(uri)); |
| + } |
| +} |
| + |
| +/// Concrete implementation of [FileSystemEntity] for use by |
| +/// [MemoryFileSystem]. |
| +class MemoryFileSystemEntity implements FileSystemEntity { |
| + final MemoryFileSystem _fileSystem; |
| + |
| + @override |
| + final String path; |
| + |
| + MemoryFileSystemEntity._(this._fileSystem, this.path); |
| + |
| + @override |
| + int get hashCode => path.hashCode; |
| + |
| + @override |
| + bool operator ==(Object other) => |
| + other is MemoryFileSystemEntity && other.path == path; |
|
Siggi Cherem (dart-lang)
2016/11/03 00:46:50
I'm ok not adding it, but any need to also check t
Paul Berry
2016/11/03 15:16:41
Done.
|
| + |
| + @override |
| + Future<List<int>> readAsBytes() async { |
| + List<int> contents = _fileSystem._files[path]; |
| + if (contents != null) { |
| + return contents.toList(); |
| + } |
| + throw new Exception('File does not exist'); |
| + } |
| + |
| + @override |
| + Future<String> readAsString() async { |
| + List<int> contents = await readAsBytes(); |
| + return UTF8.decode(contents); |
| + } |
| + |
| + /// Writes the given raw bytes to this file system entity. |
| + /// |
| + /// 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); |
| + } |
| + |
| + /// Writes the given string to this file system entity. |
| + /// |
| + /// The string is encoded as UTF-8. |
| + /// |
| + /// If no file exists, one is created. If a file exists already, it is |
| + /// overwritten. |
| + void writeAsStringSync(String s) { |
| + _fileSystem._files[path] = UTF8.encode(s); |
|
scheglov
2016/11/03 02:15:23
AFAIK UTF8 returns Uint8List at runtime, but the s
Paul Berry
2016/11/03 15:16:41
True. That means that technically this implementa
|
| + } |
| +} |