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 c1739b80b0e683464b4fc80c334665e432cae314..66977c472fc347921240701911ff6560bff928c5 100644 |
--- a/pkg/analysis_server/lib/src/context_manager.dart |
+++ b/pkg/analysis_server/lib/src/context_manager.dart |
@@ -9,6 +9,7 @@ import 'dart:collection'; |
import 'dart:convert'; |
import 'dart:core'; |
+import 'package:analysis_server/src/analysis_server.dart'; |
import 'package:analyzer/exception/exception.dart'; |
import 'package:analyzer/file_system/file_system.dart'; |
import 'package:analyzer/instrumentation/instrumentation.dart'; |
@@ -16,8 +17,10 @@ import 'package:analyzer/plugin/options.dart'; |
import 'package:analyzer/plugin/resolver_provider.dart'; |
import 'package:analyzer/source/analysis_options_provider.dart'; |
import 'package:analyzer/source/config.dart'; |
+import 'package:analyzer/source/package_map_provider.dart'; |
import 'package:analyzer/source/package_map_resolver.dart'; |
import 'package:analyzer/source/path_filter.dart'; |
+import 'package:analyzer/source/pub_package_map_provider.dart'; |
import 'package:analyzer/source/sdk_ext.dart'; |
import 'package:analyzer/src/context/builder.dart'; |
import 'package:analyzer/src/context/context.dart' as context; |
@@ -331,6 +334,12 @@ abstract class ContextManagerCallbacks { |
void applyChangesToContext(Folder contextFolder, ChangeSet changeSet); |
/** |
+ * Signals that the context manager has started to compute a package map (if |
+ * [computing] is `true`) or has finished (if [computing] is `false`). |
+ */ |
+ void computingPackageMap(bool computing); |
+ |
+ /** |
* Create and return a context builder that can be used to create a context |
* for the files in the given [folder] when analyzed using the given [options]. |
*/ |
@@ -446,8 +455,12 @@ class ContextManagerImpl implements ContextManager { |
final ResolverProvider packageResolverProvider; |
/** |
- * Provider of analysis options. |
+ * Provider which is used to determine the mapping from package name to |
+ * package folder. |
*/ |
+ final PubPackageMapProvider _packageMapProvider; |
+ |
+ /// Provider of analysis options. |
AnalysisOptionsProvider analysisOptionsProvider = |
new AnalysisOptionsProvider(); |
@@ -493,6 +506,7 @@ class ContextManagerImpl implements ContextManager { |
this.resourceProvider, |
this.sdkManager, |
this.packageResolverProvider, |
+ this._packageMapProvider, |
this.analyzedFilesGlobs, |
this._instrumentationService, |
this.defaultContextOptions) { |
@@ -969,19 +983,35 @@ class ContextManagerImpl implements ContextManager { |
// resolve packages. |
return new NoPackageFolderDisposition(packageRoot: packageRoot); |
} else { |
- // Try .packages first. |
- if (absolutePathContext.basename(packagespecFile.path) == |
- PACKAGE_SPEC_NAME) { |
- Packages packages = _readPackagespec(packagespecFile); |
- return new PackagesFileDisposition(packages); |
- } |
- if (packageResolverProvider != null) { |
- UriResolver resolver = packageResolverProvider(folder); |
- if (resolver != null) { |
- return new CustomPackageResolverDisposition(resolver); |
+ PackageMapInfo packageMapInfo; |
+ callbacks.computingPackageMap(true); |
+ try { |
+ // Try .packages first. |
+ if (absolutePathContext.basename(packagespecFile.path) == |
+ PACKAGE_SPEC_NAME) { |
+ Packages packages = _readPackagespec(packagespecFile); |
+ return new PackagesFileDisposition(packages); |
} |
+ if (packageResolverProvider != null) { |
+ UriResolver resolver = packageResolverProvider(folder); |
+ if (resolver != null) { |
+ return new CustomPackageResolverDisposition(resolver); |
+ } |
+ } |
+ |
+ ServerPerformanceStatistics.pub.makeCurrentWhile(() { |
+ packageMapInfo = _packageMapProvider.computePackageMap(folder); |
+ }); |
+ } finally { |
+ callbacks.computingPackageMap(false); |
+ } |
+ for (String dependencyPath in packageMapInfo.dependencies) { |
+ addDependency(dependencyPath); |
+ } |
+ if (packageMapInfo.packageMap == null) { |
+ return new NoPackageFolderDisposition(); |
} |
- return new NoPackageFolderDisposition(); |
+ return new PackageMapDisposition(packageMapInfo.packageMap); |
} |
} |