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 5088ae180ddf5d0b2f5fbfe4c0c4b2263de61543..a4e5849dc9b2b84946df3dd5c906d87bdd5fcee2 100644 |
--- a/pkg/analysis_server/lib/src/context_manager.dart |
+++ b/pkg/analysis_server/lib/src/context_manager.dart |
@@ -730,7 +730,7 @@ class ContextManagerImpl implements ContextManager { |
* dependencies (currently we only use it to track "pub list" dependencies). |
*/ |
FolderDisposition _computeFolderDisposition( |
- Folder folder, void addDependency(String path)) { |
+ Folder folder, void addDependency(String path), File packagespecFile) { |
String packageRoot = normalizedPackageRoots[folder.path]; |
if (packageRoot != null) { |
// TODO(paulberry): We shouldn't be using JavaFile here because it |
@@ -763,18 +763,28 @@ class ContextManagerImpl implements ContextManager { |
// resolve packages. |
return new NoPackageFolderDisposition(packageRoot: packageRoot); |
} else { |
+ PackageMapInfo packageMapInfo; |
callbacks.beginComputePackageMap(); |
- if (packageResolverProvider != null) { |
- UriResolver resolver = packageResolverProvider(folder); |
- if (resolver != null) { |
- return new CustomPackageResolverDisposition(resolver); |
+ try { |
+ if (ENABLE_PACKAGESPEC_SUPPORT) { |
+ // Try .packages first. |
+ if (pathos.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.endComputePackageMap(); |
} |
- PackageMapInfo packageMapInfo; |
- ServerPerformanceStatistics.pub.makeCurrentWhile(() { |
- packageMapInfo = _packageMapProvider.computePackageMap(folder); |
- }); |
- callbacks.endComputePackageMap(); |
for (String dependencyPath in packageMapInfo.dependencies) { |
addDependency(dependencyPath); |
} |
@@ -798,17 +808,10 @@ class ContextManagerImpl implements ContextManager { |
FolderDisposition disposition; |
List<String> dependencies = <String>[]; |
- if (ENABLE_PACKAGESPEC_SUPPORT) { |
- // Try .packages first. |
- if (pathos.basename(packagespecFile.path) == PACKAGE_SPEC_NAME) { |
- Packages packages = _readPackagespec(packagespecFile); |
- disposition = new PackagesFileDisposition(packages); |
- } |
- } |
- |
// Next resort to a package uri resolver. |
if (disposition == null) { |
- disposition = _computeFolderDisposition(folder, dependencies.add); |
+ disposition = |
+ _computeFolderDisposition(folder, dependencies.add, packagespecFile); |
} |
info.setDependencies(dependencies); |
@@ -833,18 +836,7 @@ class ContextManagerImpl implements ContextManager { |
ContextInfo parent, Folder folder, bool withPackageSpecOnly) { |
// Decide whether a context needs to be created for [folder] here, and if |
// so, create it. |
- File packageSpec; |
- |
- if (ENABLE_PACKAGESPEC_SUPPORT) { |
- // Start by looking for .packages. |
- packageSpec = folder.getChild(PACKAGE_SPEC_NAME); |
- } |
- |
- // Fall back to looking for a pubspec. |
- if (packageSpec == null || !packageSpec.exists) { |
- packageSpec = folder.getChild(PUBSPEC_NAME); |
- } |
- |
+ File packageSpec = _findPackageSpecFile(folder); |
bool createContext = packageSpec.exists || !withPackageSpecOnly; |
if (withPackageSpecOnly && |
packageSpec.exists && |
@@ -929,6 +921,28 @@ class ContextManagerImpl implements ContextManager { |
} |
/** |
+ * Find the file that should be used to determine whether a context needs to |
+ * be created here--this is either the ".packages" file or the "pubspec.yaml" |
+ * file. |
+ */ |
+ File _findPackageSpecFile(Folder folder) { |
+ // Decide whether a context needs to be created for [folder] here, and if |
+ // so, create it. |
+ File packageSpec; |
+ |
+ if (ENABLE_PACKAGESPEC_SUPPORT) { |
+ // Start by looking for .packages. |
+ packageSpec = folder.getChild(PACKAGE_SPEC_NAME); |
+ } |
+ |
+ // Fall back to looking for a pubspec. |
+ if (packageSpec == null || !packageSpec.exists) { |
+ packageSpec = folder.getChild(PUBSPEC_NAME); |
+ } |
+ return packageSpec; |
+ } |
+ |
+ /** |
* Return the [ContextInfo] for the "innermost" context whose associated |
* folder is or contains the given path. ("innermost" refers to the nesting |
* of contexts, so if there is a context for path /foo and a context for |
@@ -1182,8 +1196,8 @@ class ContextManagerImpl implements ContextManager { |
// while we're rerunning "pub list", since any analysis we complete while |
// "pub list" is in progress is just going to get thrown away anyhow. |
List<String> dependencies = <String>[]; |
- FolderDisposition disposition = |
- _computeFolderDisposition(info.folder, dependencies.add); |
+ FolderDisposition disposition = _computeFolderDisposition( |
+ info.folder, dependencies.add, _findPackageSpecFile(info.folder)); |
info.setDependencies(dependencies); |
callbacks.updateContextPackageUriResolver(info.folder, disposition); |
} |