forked from dart-lang/sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add implementations of the front end FileSystem API.
This required some small changes to the API contract. Note that the tests use supermixins. I'm assuming that supermixin functionality will be available on all platforms by the time this is needed. If not, I will be happy to rewrite them. [email protected], [email protected] Review URL: https://codereview.chromium.org/2471283002 .
- Loading branch information
1 parent
4682ea9
commit 28b6a1f
Showing
8 changed files
with
643 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
// 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'); | ||
// 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)); | ||
} | ||
} | ||
|
||
/// 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 && | ||
identical(other._fileSystem, _fileSystem); | ||
|
||
@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) { | ||
// 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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// 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.physical_file_system; | ||
|
||
import 'dart:async'; | ||
import 'dart:io' as io; | ||
|
||
import 'package:path/path.dart' as p; | ||
|
||
import 'file_system.dart'; | ||
|
||
/// Concrete implementation of [FileSystem] which performs its operations using | ||
/// I/O. | ||
/// | ||
/// Not intended to be implemented or extended by clients. | ||
class PhysicalFileSystem implements FileSystem { | ||
static final PhysicalFileSystem instance = new PhysicalFileSystem._(); | ||
|
||
PhysicalFileSystem._(); | ||
|
||
@override | ||
p.Context get context => p.context; | ||
|
||
@override | ||
FileSystemEntity entityForPath(String path) => | ||
new _PhysicalFileSystemEntity(context.normalize(context.absolute(path))); | ||
|
||
@override | ||
FileSystemEntity 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)); | ||
} | ||
} | ||
|
||
/// Concrete implementation of [FileSystemEntity] for use by | ||
/// [PhysicalFileSystem]. | ||
class _PhysicalFileSystemEntity implements FileSystemEntity { | ||
@override | ||
final String path; | ||
|
||
_PhysicalFileSystemEntity(this.path); | ||
|
||
@override | ||
int get hashCode => path.hashCode; | ||
|
||
@override | ||
bool operator ==(Object other) => | ||
other is _PhysicalFileSystemEntity && other.path == path; | ||
|
||
@override | ||
Future<List<int>> readAsBytes() => new io.File(path).readAsBytes(); | ||
|
||
@override | ||
Future<String> readAsString() => new io.File(path).readAsString(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.