| 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 context.directory.manager; | 5 library context.directory.manager; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 import 'package:analysis_server/src/analysis_server.dart'; | 10 import 'package:analysis_server/src/analysis_server.dart'; |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 String shortName = child.shortName; | 380 String shortName = child.shortName; |
| 381 if (shortName == PACKAGES_NAME) { | 381 if (shortName == PACKAGES_NAME) { |
| 382 continue; | 382 continue; |
| 383 } | 383 } |
| 384 _addSourceFiles(changeSet, child, info); | 384 _addSourceFiles(changeSet, child, info); |
| 385 } | 385 } |
| 386 } | 386 } |
| 387 } | 387 } |
| 388 | 388 |
| 389 /** | 389 /** |
| 390 * Cancel all dependency subscriptions for the given context. |
| 391 */ |
| 392 void _cancelDependencySubscriptions(_ContextInfo info) { |
| 393 for (StreamSubscription<WatchEvent> s in info.dependencySubscriptions) { |
| 394 s.cancel(); |
| 395 } |
| 396 info.dependencySubscriptions.clear(); |
| 397 } |
| 398 |
| 399 /** |
| 390 * Compute the appropriate package URI resolver for [folder], and store | 400 * Compute the appropriate package URI resolver for [folder], and store |
| 391 * dependency information in [info]. Return `null` if no package map can | 401 * dependency information in [info]. Return `null` if no package map can |
| 392 * be computed. | 402 * be computed. |
| 393 */ | 403 */ |
| 394 UriResolver _computePackageUriResolver(Folder folder, _ContextInfo info) { | 404 UriResolver _computePackageUriResolver(Folder folder, _ContextInfo info) { |
| 405 _cancelDependencySubscriptions(info); |
| 395 if (info.packageRoot != null) { | 406 if (info.packageRoot != null) { |
| 396 info.packageMapInfo = null; | 407 info.packageMapInfo = null; |
| 397 JavaFile packagesDir = new JavaFile(info.packageRoot); | 408 JavaFile packagesDir = new JavaFile(info.packageRoot); |
| 398 Map<String, List<Folder>> packageMap = new Map<String, List<Folder>>(); | 409 Map<String, List<Folder>> packageMap = new Map<String, List<Folder>>(); |
| 399 if (packagesDir.isDirectory()) { | 410 if (packagesDir.isDirectory()) { |
| 400 for (JavaFile file in packagesDir.listFiles()) { | 411 for (JavaFile file in packagesDir.listFiles()) { |
| 401 // Ensure symlinks in packages directory are canonicalized | 412 // Ensure symlinks in packages directory are canonicalized |
| 402 // to prevent 'type X cannot be assigned to type X' warnings | 413 // to prevent 'type X cannot be assigned to type X' warnings |
| 403 String path; | 414 String path; |
| 404 try { | 415 try { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 418 //TODO(danrubel) remove this if it will never be called | 429 //TODO(danrubel) remove this if it will never be called |
| 419 return new PackageUriResolver([packagesDir]); | 430 return new PackageUriResolver([packagesDir]); |
| 420 } else { | 431 } else { |
| 421 beginComputePackageMap(); | 432 beginComputePackageMap(); |
| 422 OptimizingPubPackageMapInfo packageMapInfo; | 433 OptimizingPubPackageMapInfo packageMapInfo; |
| 423 ServerPerformanceStatistics.pub.makeCurrentWhile(() { | 434 ServerPerformanceStatistics.pub.makeCurrentWhile(() { |
| 424 packageMapInfo = | 435 packageMapInfo = |
| 425 _packageMapProvider.computePackageMap(folder, info.packageMapInfo); | 436 _packageMapProvider.computePackageMap(folder, info.packageMapInfo); |
| 426 }); | 437 }); |
| 427 endComputePackageMap(); | 438 endComputePackageMap(); |
| 439 for (String dependencyPath in packageMapInfo.dependencies) { |
| 440 Resource resource = resourceProvider.getResource(dependencyPath); |
| 441 if (resource is File) { |
| 442 info.dependencySubscriptions.add(resource.changes |
| 443 .listen((WatchEvent event) { |
| 444 if (info.packageMapInfo != null && |
| 445 info.packageMapInfo.isChangedDependency( |
| 446 dependencyPath, resourceProvider)) { |
| 447 _recomputePackageUriResolver(info); |
| 448 } |
| 449 })); |
| 450 } |
| 451 } |
| 428 info.packageMapInfo = packageMapInfo; | 452 info.packageMapInfo = packageMapInfo; |
| 429 if (packageMapInfo.packageMap == null) { | 453 if (packageMapInfo.packageMap == null) { |
| 430 return null; | 454 return null; |
| 431 } | 455 } |
| 432 return new PackageMapUriResolver( | 456 return new PackageMapUriResolver( |
| 433 resourceProvider, packageMapInfo.packageMap); | 457 resourceProvider, packageMapInfo.packageMap); |
| 434 // TODO(paulberry): if any of the dependencies is outside of [folder], | 458 // TODO(paulberry): if any of the dependencies is outside of [folder], |
| 435 // we'll need to watch their parent folders as well. | 459 // we'll need to watch their parent folders as well. |
| 436 } | 460 } |
| 437 } | 461 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 ChangeSet changeSet = new ChangeSet(); | 530 ChangeSet changeSet = new ChangeSet(); |
| 507 _addSourceFiles(changeSet, folder, info); | 531 _addSourceFiles(changeSet, folder, info); |
| 508 applyChangesToContext(folder, changeSet); | 532 applyChangesToContext(folder, changeSet); |
| 509 return info; | 533 return info; |
| 510 } | 534 } |
| 511 | 535 |
| 512 /** | 536 /** |
| 513 * Clean up and destroy the context associated with the given folder. | 537 * Clean up and destroy the context associated with the given folder. |
| 514 */ | 538 */ |
| 515 void _destroyContext(Folder folder) { | 539 void _destroyContext(Folder folder) { |
| 516 _contexts[folder].changeSubscription.cancel(); | 540 _ContextInfo info = _contexts[folder]; |
| 541 info.changeSubscription.cancel(); |
| 542 _cancelDependencySubscriptions(info); |
| 517 removeContext(folder); | 543 removeContext(folder); |
| 518 _contexts.remove(folder); | 544 _contexts.remove(folder); |
| 519 } | 545 } |
| 520 | 546 |
| 521 /** | 547 /** |
| 522 * Extract a new [pubspecFile]-based context from [oldInfo]. | 548 * Extract a new [pubspecFile]-based context from [oldInfo]. |
| 523 */ | 549 */ |
| 524 void _extractContext(_ContextInfo oldInfo, File pubspecFile) { | 550 void _extractContext(_ContextInfo oldInfo, File pubspecFile) { |
| 525 Folder newFolder = pubspecFile.parent; | 551 Folder newFolder = pubspecFile.parent; |
| 526 _ContextInfo newInfo = _createContext(newFolder, pubspecFile, []); | 552 _ContextInfo newInfo = _createContext(newFolder, pubspecFile, []); |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 742 */ | 768 */ |
| 743 String pubspecPath; | 769 String pubspecPath; |
| 744 | 770 |
| 745 /** | 771 /** |
| 746 * Stream subscription we are using to watch the context's directory for | 772 * Stream subscription we are using to watch the context's directory for |
| 747 * changes. | 773 * changes. |
| 748 */ | 774 */ |
| 749 StreamSubscription<WatchEvent> changeSubscription; | 775 StreamSubscription<WatchEvent> changeSubscription; |
| 750 | 776 |
| 751 /** | 777 /** |
| 778 * Stream subscriptions we are using to watch the files |
| 779 * used to determine the package map. |
| 780 */ |
| 781 final List<StreamSubscription<WatchEvent>> dependencySubscriptions = |
| 782 <StreamSubscription<WatchEvent>>[]; |
| 783 |
| 784 /** |
| 752 * The analysis context that was created for the [folder]. | 785 * The analysis context that was created for the [folder]. |
| 753 */ | 786 */ |
| 754 AnalysisContext context; | 787 AnalysisContext context; |
| 755 | 788 |
| 756 /** | 789 /** |
| 757 * Map from full path to the [Source] object, for each source that has been | 790 * Map from full path to the [Source] object, for each source that has been |
| 758 * added to the context. | 791 * added to the context. |
| 759 */ | 792 */ |
| 760 Map<String, Source> sources = new HashMap<String, Source>(); | 793 Map<String, Source> sources = new HashMap<String, Source>(); |
| 761 | 794 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 return excludes(resource.path); | 827 return excludes(resource.path); |
| 795 } | 828 } |
| 796 | 829 |
| 797 /** | 830 /** |
| 798 * Returns `true` if [path] is the pubspec file of this context. | 831 * Returns `true` if [path] is the pubspec file of this context. |
| 799 */ | 832 */ |
| 800 bool isPubspec(String path) { | 833 bool isPubspec(String path) { |
| 801 return path == pubspecPath; | 834 return path == pubspecPath; |
| 802 } | 835 } |
| 803 } | 836 } |
| OLD | NEW |