Index: analyzer/lib/file_system/memory_file_system.dart |
diff --git a/analyzer/lib/file_system/memory_file_system.dart b/analyzer/lib/file_system/memory_file_system.dart |
deleted file mode 100644 |
index 8ce24724a18ce4ac0476632f311c79e7d7d943eb..0000000000000000000000000000000000000000 |
--- a/analyzer/lib/file_system/memory_file_system.dart |
+++ /dev/null |
@@ -1,481 +0,0 @@ |
-// Copyright (c) 2014, 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 memory_file_system; |
- |
-import 'dart:async'; |
-import 'dart:collection'; |
-import 'dart:core' hide Resource; |
- |
-import 'package:analyzer/src/generated/engine.dart' show TimestampedData; |
-import 'package:analyzer/src/generated/source_io.dart'; |
-import 'package:path/path.dart'; |
-import 'package:watcher/watcher.dart'; |
- |
-import 'file_system.dart'; |
- |
-/** |
- * An in-memory implementation of [ResourceProvider]. |
- * Use `/` as a path separator. |
- */ |
-class MemoryResourceProvider implements ResourceProvider { |
- final Map<String, _MemoryResource> _pathToResource = |
- new HashMap<String, _MemoryResource>(); |
- final Map<String, String> _pathToContent = new HashMap<String, String>(); |
- final Map<String, int> _pathToTimestamp = new HashMap<String, int>(); |
- final Map<String, List<StreamController<WatchEvent>>> _pathToWatchers = |
- new HashMap<String, List<StreamController<WatchEvent>>>(); |
- int nextStamp = 0; |
- |
- @override |
- Context get pathContext => posix; |
- |
- /** |
- * Delete the file with the given path. |
- */ |
- void deleteFile(String path) { |
- _checkFileAtPath(path); |
- _pathToResource.remove(path); |
- _pathToContent.remove(path); |
- _pathToTimestamp.remove(path); |
- _notifyWatchers(path, ChangeType.REMOVE); |
- } |
- |
- /** |
- * Delete the folder with the given path |
- * and recurively delete nested files and folders. |
- */ |
- void deleteFolder(String path) { |
- _checkFolderAtPath(path); |
- _MemoryFolder folder = _pathToResource[path]; |
- for (Resource child in folder.getChildren()) { |
- if (child is File) { |
- deleteFile(child.path); |
- } else if (child is Folder) { |
- deleteFolder(child.path); |
- } else { |
- throw 'failed to delete resource: $child'; |
- } |
- } |
- _pathToResource.remove(path); |
- _pathToContent.remove(path); |
- _pathToTimestamp.remove(path); |
- _notifyWatchers(path, ChangeType.REMOVE); |
- } |
- |
- @override |
- File getFile(String path) => new _MemoryFile(this, path); |
- |
- @override |
- Folder getFolder(String path) => newFolder(path); |
- |
- @override |
- Resource getResource(String path) { |
- path = posix.normalize(path); |
- Resource resource = _pathToResource[path]; |
- if (resource == null) { |
- resource = new _MemoryFile(this, path); |
- } |
- return resource; |
- } |
- |
- @override |
- Folder getStateLocation(String pluginId) { |
- return newFolder('/user/home/$pluginId'); |
- } |
- |
- void modifyFile(String path, String content) { |
- _checkFileAtPath(path); |
- _pathToContent[path] = content; |
- _pathToTimestamp[path] = nextStamp++; |
- _notifyWatchers(path, ChangeType.MODIFY); |
- } |
- |
- /** |
- * Create a resource representing a dummy link (that is, a File object which |
- * appears in its parent directory, but whose `exists` property is false) |
- */ |
- File newDummyLink(String path) { |
- path = posix.normalize(path); |
- newFolder(posix.dirname(path)); |
- _MemoryDummyLink link = new _MemoryDummyLink(this, path); |
- _pathToResource[path] = link; |
- _pathToTimestamp[path] = nextStamp++; |
- _notifyWatchers(path, ChangeType.ADD); |
- return link; |
- } |
- |
- File newFile(String path, String content, [int stamp]) { |
- path = posix.normalize(path); |
- newFolder(posix.dirname(path)); |
- _MemoryFile file = new _MemoryFile(this, path); |
- _pathToResource[path] = file; |
- _pathToContent[path] = content; |
- _pathToTimestamp[path] = stamp != null ? stamp : nextStamp++; |
- _notifyWatchers(path, ChangeType.ADD); |
- return file; |
- } |
- |
- Folder newFolder(String path) { |
- path = posix.normalize(path); |
- if (!path.startsWith('/')) { |
- throw new ArgumentError("Path must start with '/'"); |
- } |
- _MemoryResource resource = _pathToResource[path]; |
- if (resource == null) { |
- String parentPath = posix.dirname(path); |
- if (parentPath != path) { |
- newFolder(parentPath); |
- } |
- _MemoryFolder folder = new _MemoryFolder(this, path); |
- _pathToResource[path] = folder; |
- _pathToTimestamp[path] = nextStamp++; |
- return folder; |
- } else if (resource is _MemoryFolder) { |
- return resource; |
- } else { |
- String message = |
- 'Folder expected at ' "'$path'" 'but ${resource.runtimeType} found'; |
- throw new ArgumentError(message); |
- } |
- } |
- |
- File updateFile(String path, String content, [int stamp]) { |
- path = posix.normalize(path); |
- newFolder(posix.dirname(path)); |
- _MemoryFile file = new _MemoryFile(this, path); |
- _pathToResource[path] = file; |
- _pathToContent[path] = content; |
- _pathToTimestamp[path] = stamp != null ? stamp : nextStamp++; |
- _notifyWatchers(path, ChangeType.MODIFY); |
- return file; |
- } |
- |
- void _checkFileAtPath(String path) { |
- _MemoryResource resource = _pathToResource[path]; |
- if (resource is! _MemoryFile) { |
- throw new ArgumentError( |
- 'File expected at "$path" but ${resource.runtimeType} found'); |
- } |
- } |
- |
- void _checkFolderAtPath(String path) { |
- _MemoryResource resource = _pathToResource[path]; |
- if (resource is! _MemoryFolder) { |
- throw new ArgumentError( |
- 'Folder expected at "$path" but ${resource.runtimeType} found'); |
- } |
- } |
- |
- void _notifyWatchers(String path, ChangeType changeType) { |
- _pathToWatchers.forEach((String watcherPath, |
- List<StreamController<WatchEvent>> streamControllers) { |
- if (watcherPath == path || posix.isWithin(watcherPath, path)) { |
- for (StreamController<WatchEvent> streamController |
- in streamControllers) { |
- streamController.add(new WatchEvent(changeType, path)); |
- } |
- } |
- }); |
- } |
-} |
- |
-/** |
- * An in-memory implementation of [File] which acts like a symbolic link to a |
- * non-existent file. |
- */ |
-class _MemoryDummyLink extends _MemoryResource implements File { |
- _MemoryDummyLink(MemoryResourceProvider provider, String path) |
- : super(provider, path); |
- |
- @override |
- Stream<WatchEvent> get changes { |
- throw new FileSystemException(path, "File does not exist"); |
- } |
- |
- @override |
- bool get exists => false; |
- |
- int get modificationStamp { |
- int stamp = _provider._pathToTimestamp[path]; |
- if (stamp == null) { |
- throw new FileSystemException(path, "File does not exist"); |
- } |
- return stamp; |
- } |
- |
- String get _content { |
- throw new FileSystemException(path, 'File could not be read'); |
- } |
- |
- @override |
- Source createSource([Uri uri]) { |
- throw new FileSystemException(path, 'File could not be read'); |
- } |
- |
- @override |
- bool isOrContains(String path) { |
- return path == this.path; |
- } |
- |
- @override |
- String readAsStringSync() { |
- throw new FileSystemException(path, 'File could not be read'); |
- } |
-} |
- |
-/** |
- * An in-memory implementation of [File]. |
- */ |
-class _MemoryFile extends _MemoryResource implements File { |
- _MemoryFile(MemoryResourceProvider provider, String path) |
- : super(provider, path); |
- |
- @override |
- bool get exists => _provider._pathToResource[path] is _MemoryFile; |
- |
- int get modificationStamp { |
- int stamp = _provider._pathToTimestamp[path]; |
- if (stamp == null) { |
- throw new FileSystemException(path, 'File "$path" does not exist.'); |
- } |
- return stamp; |
- } |
- |
- String get _content { |
- String content = _provider._pathToContent[path]; |
- if (content == null) { |
- throw new FileSystemException(path, 'File "$path" does not exist.'); |
- } |
- return content; |
- } |
- |
- @override |
- Source createSource([Uri uri]) { |
- if (uri == null) { |
- uri = posix.toUri(path); |
- } |
- return new _MemoryFileSource(this, uri); |
- } |
- |
- @override |
- bool isOrContains(String path) { |
- return path == this.path; |
- } |
- |
- @override |
- String readAsStringSync() { |
- String content = _provider._pathToContent[path]; |
- if (content == null) { |
- throw new FileSystemException(path, 'File "$path" does not exist.'); |
- } |
- return content; |
- } |
-} |
- |
-/** |
- * An in-memory implementation of [Source]. |
- */ |
-class _MemoryFileSource extends Source { |
- /** |
- * Map from encoded URI/filepath pair to a unique integer identifier. This |
- * identifier is used for equality tests and hash codes. |
- * |
- * The URI and filepath are joined into a pair by separating them with an '@' |
- * character. |
- */ |
- static final Map<String, int> _idTable = new HashMap<String, int>(); |
- |
- final _MemoryFile file; |
- |
- final Uri uri; |
- |
- /** |
- * The unique ID associated with this [_MemoryFileSource]. |
- */ |
- final int id; |
- |
- _MemoryFileSource(_MemoryFile file, Uri uri) |
- : uri = uri, |
- file = file, |
- id = _idTable.putIfAbsent('$uri@${file.path}', () => _idTable.length); |
- |
- @override |
- TimestampedData<String> get contents { |
- return new TimestampedData<String>(modificationStamp, file._content); |
- } |
- |
- @override |
- String get encoding { |
- return uri.toString(); |
- } |
- |
- @override |
- String get fullName => file.path; |
- |
- @override |
- int get hashCode => id; |
- |
- @override |
- bool get isInSystemLibrary => uriKind == UriKind.DART_URI; |
- |
- @override |
- int get modificationStamp { |
- try { |
- return file.modificationStamp; |
- } on FileSystemException { |
- return -1; |
- } |
- } |
- |
- @override |
- String get shortName => file.shortName; |
- |
- @override |
- UriKind get uriKind { |
- String scheme = uri.scheme; |
- if (scheme == PackageUriResolver.PACKAGE_SCHEME) { |
- return UriKind.PACKAGE_URI; |
- } else if (scheme == DartUriResolver.DART_SCHEME) { |
- return UriKind.DART_URI; |
- } else if (scheme == FileUriResolver.FILE_SCHEME) { |
- return UriKind.FILE_URI; |
- } |
- return UriKind.FILE_URI; |
- } |
- |
- @override |
- bool operator ==(other) { |
- return other is _MemoryFileSource && other.id == id; |
- } |
- |
- @override |
- bool exists() => file.exists; |
- |
- @override |
- Uri resolveRelativeUri(Uri relativeUri) { |
- return uri.resolveUri(relativeUri); |
- } |
- |
- @override |
- String toString() => file.toString(); |
-} |
- |
-/** |
- * An in-memory implementation of [Folder]. |
- */ |
-class _MemoryFolder extends _MemoryResource implements Folder { |
- _MemoryFolder(MemoryResourceProvider provider, String path) |
- : super(provider, path); |
- |
- @override |
- bool get exists => _provider._pathToResource[path] is _MemoryFolder; |
- |
- @override |
- String canonicalizePath(String relPath) { |
- relPath = posix.normalize(relPath); |
- String childPath = posix.join(path, relPath); |
- childPath = posix.normalize(childPath); |
- return childPath; |
- } |
- |
- @override |
- bool contains(String path) { |
- return posix.isWithin(this.path, path); |
- } |
- |
- @override |
- Resource getChild(String relPath) { |
- String childPath = canonicalizePath(relPath); |
- _MemoryResource resource = _provider._pathToResource[childPath]; |
- if (resource == null) { |
- resource = new _MemoryFile(_provider, childPath); |
- } |
- return resource; |
- } |
- |
- @override |
- _MemoryFolder getChildAssumingFolder(String relPath) { |
- String childPath = canonicalizePath(relPath); |
- _MemoryResource resource = _provider._pathToResource[childPath]; |
- if (resource is _MemoryFolder) { |
- return resource; |
- } |
- return new _MemoryFolder(_provider, childPath); |
- } |
- |
- @override |
- List<Resource> getChildren() { |
- if (!exists) { |
- throw new FileSystemException(path, 'Folder does not exist.'); |
- } |
- List<Resource> children = <Resource>[]; |
- _provider._pathToResource.forEach((resourcePath, resource) { |
- if (posix.dirname(resourcePath) == path) { |
- children.add(resource); |
- } |
- }); |
- return children; |
- } |
- |
- @override |
- bool isOrContains(String path) { |
- if (path == this.path) { |
- return true; |
- } |
- return contains(path); |
- } |
-} |
- |
-/** |
- * An in-memory implementation of [Resource]. |
- */ |
-abstract class _MemoryResource implements Resource { |
- final MemoryResourceProvider _provider; |
- final String path; |
- |
- _MemoryResource(this._provider, this.path); |
- |
- Stream<WatchEvent> get changes { |
- StreamController<WatchEvent> streamController = |
- new StreamController<WatchEvent>(); |
- if (!_provider._pathToWatchers.containsKey(path)) { |
- _provider._pathToWatchers[path] = <StreamController<WatchEvent>>[]; |
- } |
- _provider._pathToWatchers[path].add(streamController); |
- streamController.done.then((_) { |
- _provider._pathToWatchers[path].remove(streamController); |
- if (_provider._pathToWatchers[path].isEmpty) { |
- _provider._pathToWatchers.remove(path); |
- } |
- }); |
- return streamController.stream; |
- } |
- |
- @override |
- get hashCode => path.hashCode; |
- |
- @override |
- Folder get parent { |
- String parentPath = posix.dirname(path); |
- if (parentPath == path) { |
- return null; |
- } |
- return _provider.getResource(parentPath); |
- } |
- |
- @override |
- String get shortName => posix.basename(path); |
- |
- @override |
- bool operator ==(other) { |
- if (runtimeType != other.runtimeType) { |
- return false; |
- } |
- return path == other.path; |
- } |
- |
- @override |
- String toString() => path; |
-} |