Chromium Code Reviews| Index: pkg/analysis_server/lib/src/context_manager.dart |
| diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart |
| index bfa8cb6fbd0c7fd383aefbde12a7d6ab2d3be71c..c4c7e1f71d0676af54689de14f06b54f66b35da4 100644 |
| --- a/pkg/analysis_server/lib/src/context_manager.dart |
| +++ b/pkg/analysis_server/lib/src/context_manager.dart |
| @@ -387,11 +387,22 @@ abstract class ContextManager { |
| } |
| /** |
| + * Cancel all dependency subscriptions for the given context. |
| + */ |
| + void _cancelDependencySubscriptions(_ContextInfo info) { |
| + for (StreamSubscription<WatchEvent> s in info.dependencySubscriptions) { |
| + s.cancel(); |
| + } |
| + info.dependencySubscriptions.clear(); |
| + } |
| + |
| + /** |
| * Compute the appropriate package URI resolver for [folder], and store |
| * dependency information in [info]. Return `null` if no package map can |
| * be computed. |
| */ |
| UriResolver _computePackageUriResolver(Folder folder, _ContextInfo info) { |
| + _cancelDependencySubscriptions(info); |
| if (info.packageRoot != null) { |
| info.packageMapInfo = null; |
| JavaFile packagesDir = new JavaFile(info.packageRoot); |
| @@ -425,6 +436,19 @@ abstract class ContextManager { |
| _packageMapProvider.computePackageMap(folder, info.packageMapInfo); |
| }); |
| endComputePackageMap(); |
| + for (String dependencyPath in packageMapInfo.dependencies) { |
|
Paul Berry
2015/06/18 20:15:53
There's a small race condition here, which is that
|
| + Resource resource = resourceProvider.getResource(dependencyPath); |
| + if (resource is File) { |
| + info.dependencySubscriptions.add(resource.changes |
| + .listen((WatchEvent event) { |
| + if (info.packageMapInfo != null && |
| + info.packageMapInfo.isChangedDependency( |
| + dependencyPath, resourceProvider)) { |
| + _recomputePackageUriResolver(info); |
| + } |
| + })); |
| + } |
| + } |
| info.packageMapInfo = packageMapInfo; |
| if (packageMapInfo.packageMap == null) { |
| return null; |
| @@ -513,7 +537,9 @@ abstract class ContextManager { |
| * Clean up and destroy the context associated with the given folder. |
| */ |
| void _destroyContext(Folder folder) { |
| - _contexts[folder].changeSubscription.cancel(); |
| + _ContextInfo info = _contexts[folder]; |
| + info.changeSubscription.cancel(); |
| + _cancelDependencySubscriptions(info); |
| removeContext(folder); |
| _contexts.remove(folder); |
| } |
| @@ -749,6 +775,13 @@ class _ContextInfo { |
| StreamSubscription<WatchEvent> changeSubscription; |
| /** |
| + * Stream subscriptions we are using to watch the files |
| + * used to determine the package map. |
| + */ |
| + final List<StreamSubscription<WatchEvent>> dependencySubscriptions = |
| + <StreamSubscription<WatchEvent>>[]; |
| + |
| + /** |
| * The analysis context that was created for the [folder]. |
| */ |
| AnalysisContext context; |