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