| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library memory_file_system; | 5 library memory_file_system; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 import 'package:analyzer/src/generated/engine.dart' show TimestampedData; | 10 import 'package:analyzer/src/generated/engine.dart' show TimestampedData; |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 | 176 |
| 177 /** | 177 /** |
| 178 * An in-memory implementation of [File] which acts like a symbolic link to a | 178 * An in-memory implementation of [File] which acts like a symbolic link to a |
| 179 * non-existent file. | 179 * non-existent file. |
| 180 */ | 180 */ |
| 181 class _MemoryDummyLink extends _MemoryResource implements File { | 181 class _MemoryDummyLink extends _MemoryResource implements File { |
| 182 _MemoryDummyLink(MemoryResourceProvider provider, String path) | 182 _MemoryDummyLink(MemoryResourceProvider provider, String path) |
| 183 : super(provider, path); | 183 : super(provider, path); |
| 184 | 184 |
| 185 @override | 185 @override |
| 186 Stream<WatchEvent> get changes { |
| 187 throw new FileSystemException(path, "File does not exist"); |
| 188 } |
| 189 |
| 190 @override |
| 186 bool get exists => false; | 191 bool get exists => false; |
| 187 | 192 |
| 188 int get modificationStamp { | 193 int get modificationStamp { |
| 189 int stamp = _provider._pathToTimestamp[path]; | 194 int stamp = _provider._pathToTimestamp[path]; |
| 190 if (stamp == null) { | 195 if (stamp == null) { |
| 191 throw new FileSystemException(path, "File does not exist"); | 196 throw new FileSystemException(path, "File does not exist"); |
| 192 } | 197 } |
| 193 return stamp; | 198 return stamp; |
| 194 } | 199 } |
| 195 | 200 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 } | 356 } |
| 352 | 357 |
| 353 /** | 358 /** |
| 354 * An in-memory implementation of [Folder]. | 359 * An in-memory implementation of [Folder]. |
| 355 */ | 360 */ |
| 356 class _MemoryFolder extends _MemoryResource implements Folder { | 361 class _MemoryFolder extends _MemoryResource implements Folder { |
| 357 _MemoryFolder(MemoryResourceProvider provider, String path) | 362 _MemoryFolder(MemoryResourceProvider provider, String path) |
| 358 : super(provider, path); | 363 : super(provider, path); |
| 359 | 364 |
| 360 @override | 365 @override |
| 361 Stream<WatchEvent> get changes { | |
| 362 StreamController<WatchEvent> streamController = | |
| 363 new StreamController<WatchEvent>(); | |
| 364 if (!_provider._pathToWatchers.containsKey(path)) { | |
| 365 _provider._pathToWatchers[path] = <StreamController<WatchEvent>>[]; | |
| 366 } | |
| 367 _provider._pathToWatchers[path].add(streamController); | |
| 368 streamController.done.then((_) { | |
| 369 _provider._pathToWatchers[path].remove(streamController); | |
| 370 if (_provider._pathToWatchers[path].isEmpty) { | |
| 371 _provider._pathToWatchers.remove(path); | |
| 372 } | |
| 373 }); | |
| 374 return streamController.stream; | |
| 375 } | |
| 376 | |
| 377 @override | |
| 378 bool get exists => _provider._pathToResource[path] is _MemoryFolder; | 366 bool get exists => _provider._pathToResource[path] is _MemoryFolder; |
| 379 | 367 |
| 380 @override | 368 @override |
| 381 String canonicalizePath(String relPath) { | 369 String canonicalizePath(String relPath) { |
| 382 relPath = posix.normalize(relPath); | 370 relPath = posix.normalize(relPath); |
| 383 String childPath = posix.join(path, relPath); | 371 String childPath = posix.join(path, relPath); |
| 384 childPath = posix.normalize(childPath); | 372 childPath = posix.normalize(childPath); |
| 385 return childPath; | 373 return childPath; |
| 386 } | 374 } |
| 387 | 375 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 | 423 |
| 436 /** | 424 /** |
| 437 * An in-memory implementation of [Resource]. | 425 * An in-memory implementation of [Resource]. |
| 438 */ | 426 */ |
| 439 abstract class _MemoryResource implements Resource { | 427 abstract class _MemoryResource implements Resource { |
| 440 final MemoryResourceProvider _provider; | 428 final MemoryResourceProvider _provider; |
| 441 final String path; | 429 final String path; |
| 442 | 430 |
| 443 _MemoryResource(this._provider, this.path); | 431 _MemoryResource(this._provider, this.path); |
| 444 | 432 |
| 433 Stream<WatchEvent> get changes { |
| 434 StreamController<WatchEvent> streamController = |
| 435 new StreamController<WatchEvent>(); |
| 436 if (!_provider._pathToWatchers.containsKey(path)) { |
| 437 _provider._pathToWatchers[path] = <StreamController<WatchEvent>>[]; |
| 438 } |
| 439 _provider._pathToWatchers[path].add(streamController); |
| 440 streamController.done.then((_) { |
| 441 _provider._pathToWatchers[path].remove(streamController); |
| 442 if (_provider._pathToWatchers[path].isEmpty) { |
| 443 _provider._pathToWatchers.remove(path); |
| 444 } |
| 445 }); |
| 446 return streamController.stream; |
| 447 } |
| 448 |
| 445 @override | 449 @override |
| 446 get hashCode => path.hashCode; | 450 get hashCode => path.hashCode; |
| 447 | 451 |
| 448 @override | 452 @override |
| 449 Folder get parent { | 453 Folder get parent { |
| 450 String parentPath = posix.dirname(path); | 454 String parentPath = posix.dirname(path); |
| 451 if (parentPath == path) { | 455 if (parentPath == path) { |
| 452 return null; | 456 return null; |
| 453 } | 457 } |
| 454 return _provider.getResource(parentPath); | 458 return _provider.getResource(parentPath); |
| 455 } | 459 } |
| 456 | 460 |
| 457 @override | 461 @override |
| 458 String get shortName => posix.basename(path); | 462 String get shortName => posix.basename(path); |
| 459 | 463 |
| 460 @override | 464 @override |
| 461 bool operator ==(other) { | 465 bool operator ==(other) { |
| 462 if (runtimeType != other.runtimeType) { | 466 if (runtimeType != other.runtimeType) { |
| 463 return false; | 467 return false; |
| 464 } | 468 } |
| 465 return path == other.path; | 469 return path == other.path; |
| 466 } | 470 } |
| 467 | 471 |
| 468 @override | 472 @override |
| 469 String toString() => path; | 473 String toString() => path; |
| 470 } | 474 } |
| OLD | NEW |