| 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);
|
| }
|
|
|