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 b610510c21bcc504e473043dc72fd2461c3a768d..785ccfea2fc3924a21fbc647c9c5a83e28734fdc 100644 |
--- a/pkg/analysis_server/lib/src/context_manager.dart |
+++ b/pkg/analysis_server/lib/src/context_manager.dart |
@@ -76,6 +76,11 @@ class ContextInfo { |
String packageDescriptionPath; |
/** |
+ * The folder disposition for this context. |
+ */ |
+ final FolderDisposition disposition; |
+ |
+ /** |
* Paths to files which determine the folder disposition and package map. |
* |
* TODO(paulberry): if any of these files are outside of [folder], they won't |
@@ -96,7 +101,7 @@ class ContextInfo { |
Map<String, Source> sources = new HashMap<String, Source>(); |
ContextInfo(ContextManagerImpl contextManager, this.parent, Folder folder, |
- File packagespecFile, this.packageRoot) |
+ File packagespecFile, this.packageRoot, this.disposition) |
: folder = folder, |
pathFilter = new PathFilter( |
folder.path, null, contextManager.resourceProvider.pathContext) { |
@@ -110,7 +115,9 @@ class ContextInfo { |
*/ |
ContextInfo._root() |
: folder = null, |
- pathFilter = null; |
+ pathFilter = null, |
+ packageRoot = null, |
+ disposition = null; |
/** |
* Iterate through all [children] and their children, recursively. |
@@ -583,13 +590,13 @@ class ContextManagerImpl implements ContextManager { |
info.context.analysisOptions = new AnalysisOptionsImpl(); |
// Apply inherited options. |
- options = _toStringMap(_getEmbeddedOptions(info.context)); |
+ options = _toStringMap(_getEmbeddedOptions(info)); |
if (options != null) { |
configureContextOptions(info.context, options); |
} |
} else { |
// Check for embedded options. |
- Map embeddedOptions = _getEmbeddedOptions(info.context); |
+ Map embeddedOptions = _getEmbeddedOptions(info); |
if (embeddedOptions != null) { |
options = _toStringMap(new Merger().merge(embeddedOptions, options)); |
} |
@@ -1039,17 +1046,11 @@ class ContextManagerImpl implements ContextManager { |
*/ |
ContextInfo _createContext( |
ContextInfo parent, Folder folder, File packagespecFile) { |
- ContextInfo info = new ContextInfo(this, parent, folder, packagespecFile, |
- normalizedPackageRoots[folder.path]); |
- |
- FolderDisposition disposition; |
List<String> dependencies = <String>[]; |
- |
- // Next resort to a package uri resolver. |
- if (disposition == null) { |
- disposition = |
- _computeFolderDisposition(folder, dependencies.add, packagespecFile); |
- } |
+ FolderDisposition disposition = |
+ _computeFolderDisposition(folder, dependencies.add, packagespecFile); |
+ ContextInfo info = new ContextInfo(this, parent, folder, packagespecFile, |
+ normalizedPackageRoots[folder.path], disposition); |
Map<String, Object> optionMap = readOptions(info.folder); |
AnalysisOptions options = |
@@ -1154,8 +1155,9 @@ class ContextManagerImpl implements ContextManager { |
List<UriResolver> packageUriResolvers = |
disposition.createPackageUriResolvers(resourceProvider); |
- EmbedderSdk sdk = |
- new EmbedderSdk(context.embedderYamlLocator.embedderYamls); |
+ EmbedderYamlLocator locator = |
+ disposition.getEmbedderLocator(resourceProvider); |
+ EmbedderSdk sdk = new EmbedderSdk(locator.embedderYamls); |
if (sdk.libraryMap.size() == 0) { |
// The embedder uri resolver has no mappings. Use the default Dart SDK |
// uri resolver. |
@@ -1243,29 +1245,26 @@ class ContextManagerImpl implements ContextManager { |
/// skipped. |
/// |
/// Returns null if there are no embedded/configured options. |
- Map _getEmbeddedOptions(AnalysisContext context) { |
- Map embeddedOptions; |
- |
- if (context is InternalAnalysisContext) { |
- EmbedderYamlLocator locator = context.embedderYamlLocator; |
- Iterable<YamlMap> maps = locator.embedderYamls.values; |
- if (maps.length == 1) { |
- embeddedOptions = maps.first; |
- } |
- |
- AnalysisConfiguration configuration = getConfiguration(context); |
- if (configuration != null) { |
- Map configMap = configuration.options; |
- if (configMap != null) { |
- if (embeddedOptions != null) { |
- embeddedOptions = new Merger().merge(embeddedOptions, configMap); |
- } else { |
- embeddedOptions = configMap; |
- } |
+ Map _getEmbeddedOptions(ContextInfo info) { |
+ Map embeddedOptions = null; |
+ EmbedderYamlLocator locator = |
+ info.disposition.getEmbedderLocator(resourceProvider); |
+ Iterable<YamlMap> maps = locator.embedderYamls.values; |
+ if (maps.length == 1) { |
+ embeddedOptions = maps.first; |
+ } |
+ |
+ AnalysisConfiguration configuration = getConfiguration(info.context); |
+ if (configuration != null) { |
+ Map configMap = configuration.options; |
+ if (configMap != null) { |
+ if (embeddedOptions != null) { |
+ embeddedOptions = new Merger().merge(embeddedOptions, configMap); |
+ } else { |
+ embeddedOptions = configMap; |
} |
} |
} |
- |
return embeddedOptions; |
} |
@@ -1697,6 +1696,10 @@ class CustomPackageResolverDisposition extends FolderDisposition { |
Iterable<UriResolver> createPackageUriResolvers( |
ResourceProvider resourceProvider) => |
<UriResolver>[resolver]; |
+ |
+ @override |
+ EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) => |
+ new EmbedderYamlLocator(null); |
} |
/** |
@@ -1737,6 +1740,13 @@ abstract class FolderDisposition { |
*/ |
Iterable<UriResolver> createPackageUriResolvers( |
ResourceProvider resourceProvider); |
+ |
+ /** |
+ * Return the locator used to locate the _embedder.yaml file used to configure |
+ * the SDK. The [resourceProvider] is used to access the file system in cases |
+ * where that is necessary. |
+ */ |
+ EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider); |
} |
/** |
@@ -1756,6 +1766,10 @@ class NoPackageFolderDisposition extends FolderDisposition { |
Iterable<UriResolver> createPackageUriResolvers( |
ResourceProvider resourceProvider) => |
const <UriResolver>[]; |
+ |
+ @override |
+ EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) => |
+ new EmbedderYamlLocator(null); |
} |
/** |
@@ -1765,6 +1779,8 @@ class NoPackageFolderDisposition extends FolderDisposition { |
class PackageMapDisposition extends FolderDisposition { |
final Map<String, List<Folder>> packageMap; |
+ EmbedderYamlLocator _embedderLocator; |
+ |
@override |
final String packageRoot; |
@@ -1780,6 +1796,14 @@ class PackageMapDisposition extends FolderDisposition { |
new SdkExtUriResolver(packageMap), |
new PackageMapUriResolver(resourceProvider, packageMap) |
]; |
+ |
+ @override |
+ EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) { |
+ if (_embedderLocator == null) { |
+ _embedderLocator = new EmbedderYamlLocator(packageMap); |
+ } |
+ return _embedderLocator; |
+ } |
} |
/** |
@@ -1790,22 +1814,27 @@ class PackagesFileDisposition extends FolderDisposition { |
@override |
final Packages packages; |
+ Map<String, List<Folder>> packageMap; |
+ |
+ EmbedderYamlLocator _embedderLocator; |
+ |
PackagesFileDisposition(this.packages); |
@override |
String get packageRoot => null; |
Map<String, List<Folder>> buildPackageMap(ResourceProvider resourceProvider) { |
- Map<String, List<Folder>> packageMap = <String, List<Folder>>{}; |
- if (packages == null) { |
- return packageMap; |
- } |
- packages.asMap().forEach((String name, Uri uri) { |
- if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) { |
- var path = resourceProvider.pathContext.fromUri(uri); |
- packageMap[name] = <Folder>[resourceProvider.getFolder(path)]; |
+ if (packageMap == null) { |
+ packageMap = <String, List<Folder>>{}; |
+ if (packages != null) { |
+ packages.asMap().forEach((String name, Uri uri) { |
+ if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) { |
+ var path = resourceProvider.pathContext.fromUri(uri); |
+ packageMap[name] = <Folder>[resourceProvider.getFolder(path)]; |
+ } |
+ }); |
} |
- }); |
+ } |
return packageMap; |
} |
@@ -1820,4 +1849,13 @@ class PackagesFileDisposition extends FolderDisposition { |
return const <UriResolver>[]; |
} |
} |
+ |
+ @override |
+ EmbedderYamlLocator getEmbedderLocator(ResourceProvider resourceProvider) { |
+ if (_embedderLocator == null) { |
+ _embedderLocator = |
+ new EmbedderYamlLocator(buildPackageMap(resourceProvider)); |
+ } |
+ return _embedderLocator; |
+ } |
} |