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 b52f6ad93cea4704370cb076b3b846b12045b908..bd3dc86c35347e51eb34c8a3392e0afc1b7f6920 100644 |
--- a/pkg/analysis_server/lib/src/context_manager.dart |
+++ b/pkg/analysis_server/lib/src/context_manager.dart |
@@ -8,9 +8,9 @@ import 'dart:async'; |
import 'dart:collection'; |
import 'package:analysis_server/src/analysis_server.dart'; |
+import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.dart'; |
import 'package:analyzer/file_system/file_system.dart'; |
import 'package:analyzer/instrumentation/instrumentation.dart'; |
-import 'package:analyzer/source/package_map_provider.dart'; |
import 'package:analyzer/source/package_map_resolver.dart'; |
import 'package:analyzer/src/generated/engine.dart'; |
import 'package:analyzer/src/generated/java_io.dart'; |
@@ -82,7 +82,7 @@ abstract class ContextManager { |
* Provider which is used to determine the mapping from package name to |
* package folder. |
*/ |
- final PackageMapProvider _packageMapProvider; |
+ final OptimizingPubPackageMapProvider _packageMapProvider; |
/** |
* The instrumentation service used to report instrumentation data. |
@@ -137,6 +137,20 @@ abstract class ContextManager { |
} |
/** |
+ * Return a list containing all of the contexts contained in the given |
+ * [analysisRoot]. |
+ */ |
+ List<AnalysisContext> contextsInAnalysisRoot(Folder analysisRoot) { |
+ List<AnalysisContext> contexts = <AnalysisContext>[]; |
+ _contexts.forEach((Folder contextFolder, _ContextInfo info) { |
+ if (analysisRoot.isOrContains(contextFolder.path)) { |
+ contexts.add(info.context); |
+ } |
+ }); |
+ return contexts; |
+ } |
+ |
+ /** |
* We have finished computing the package map. |
*/ |
void endComputePackageMap() { |
@@ -163,20 +177,6 @@ abstract class ContextManager { |
} |
/** |
- * Return a list containing all of the contexts contained in the given |
- * [analysisRoot]. |
- */ |
- List<AnalysisContext> contextsInAnalysisRoot(Folder analysisRoot) { |
- List<AnalysisContext> contexts = <AnalysisContext>[]; |
- _contexts.forEach((Folder contextFolder, _ContextInfo info) { |
- if (analysisRoot.isOrContains(contextFolder.path)) { |
- contexts.add(info.context); |
- } |
- }); |
- return contexts; |
- } |
- |
- /** |
* Rebuild the set of contexts from scratch based on the data last sent to |
* setRoots(). Only contexts contained in the given list of analysis [roots] |
* will be rebuilt, unless the list is `null`, in which case every context |
@@ -388,16 +388,17 @@ abstract class ContextManager { |
*/ |
UriResolver _computePackageUriResolver(Folder folder, _ContextInfo info) { |
if (info.packageRoot != null) { |
- info.packageMapDependencies = new Set<String>(); |
+ info.packageMapInfo = null; |
return new PackageUriResolver([new JavaFile(info.packageRoot)]); |
} else { |
beginComputePackageMap(); |
- PackageMapInfo packageMapInfo; |
+ OptimizingPubPackageMapInfo packageMapInfo; |
ServerPerformanceStatistics.pub.makeCurrentWhile(() { |
- packageMapInfo = _packageMapProvider.computePackageMap(folder); |
+ packageMapInfo = |
+ _packageMapProvider.computePackageMap(folder, info.packageMapInfo); |
}); |
endComputePackageMap(); |
- info.packageMapDependencies = packageMapInfo.dependencies; |
+ info.packageMapInfo = packageMapInfo; |
if (packageMapInfo.packageMap == null) { |
return null; |
} |
@@ -594,7 +595,8 @@ abstract class ContextManager { |
break; |
} |
- if (info.packageMapDependencies.contains(path)) { |
+ if (info.packageMapInfo != null && |
+ info.packageMapInfo.isChangedDependency(path, resourceProvider)) { |
_recomputePackageUriResolver(info); |
} |
} |
@@ -744,10 +746,11 @@ class _ContextInfo { |
Map<String, Source> sources = new HashMap<String, Source>(); |
/** |
- * Dependencies of the context's package map. |
- * If any of these files changes, the package map needs to be recomputed. |
+ * Info returned by the last call to |
+ * [OptimizingPubPackageMapProvider.computePackageMap], or `null` if the |
+ * package map hasn't been computed for this context yet. |
*/ |
- Set<String> packageMapDependencies; |
+ OptimizingPubPackageMapInfo packageMapInfo; |
_ContextInfo(this.folder, File pubspecFile, this.children, this.packageRoot) { |
pubspecPath = pubspecFile.path; |