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 767875ba42fafd915ecd96970444a459b825f228..aa34cf96f7e30e336bf06dde429e721ca1055a99 100644 |
--- a/pkg/analysis_server/lib/src/context_manager.dart |
+++ b/pkg/analysis_server/lib/src/context_manager.dart |
@@ -29,6 +29,7 @@ import 'package:analyzer/src/generated/source.dart'; |
import 'package:analyzer/src/generated/source_io.dart'; |
import 'package:analyzer/src/task/options.dart'; |
import 'package:analyzer/src/util/absolute_path.dart'; |
+import 'package:analyzer/src/util/yaml.dart'; |
import 'package:package_config/packages.dart'; |
import 'package:package_config/packages_file.dart' as pkgfile show parse; |
import 'package:package_config/src/packages_impl.dart' show MapPackages; |
@@ -500,15 +501,28 @@ class ContextManagerImpl implements ContextManager { |
} |
}); |
- // In case options files are removed, revert to default options. |
+ // In case options files are removed, revert to defaults. |
if (optionsRemoved) { |
+ // Start with defaults. |
info.context.analysisOptions = new AnalysisOptionsImpl(); |
+ |
+ // Apply inherited options. |
+ YamlMap embeddedOptions = _getEmbeddedOptions(info.context); |
+ if (embeddedOptions != null) { |
+ configureContextOptions(info.context, embeddedOptions); |
+ } |
return; |
} |
+ // Check for embedded options. |
+ YamlMap embeddedOptions = _getEmbeddedOptions(info.context); |
+ if (embeddedOptions != null) { |
+ options = new Merger().merge(embeddedOptions, options); |
+ } |
+ |
// Analysis options are processed 'in-line'. |
var analyzer = options[AnalyzerOptions.analyzer]; |
- if (analyzer is! YamlMap) { |
+ if (analyzer is! Map) { |
// No options for analyzer. |
return; |
} |
@@ -1008,6 +1022,20 @@ class ContextManagerImpl implements ContextManager { |
return packageSpec; |
} |
+ /// Get analysis options associated with an `_embedder.yaml`. If there is |
+ /// more than one `_embedder.yaml` associated with the given context, `null` |
+ /// is returned. |
+ YamlMap _getEmbeddedOptions(AnalysisContext context) { |
+ if (context is InternalAnalysisContext) { |
+ EmbedderYamlLocator locator = context.embedderYamlLocator; |
+ Iterable<YamlMap> maps = locator.embedderYamls.values; |
+ if (maps.length == 1) { |
+ return maps.first; |
+ } |
+ } |
+ return null; |
+ } |
+ |
/** |
* Return the [ContextInfo] for the "innermost" context whose associated |
* folder is or contains the given path. ("innermost" refers to the nesting |
@@ -1454,6 +1482,11 @@ class PackagesFileDisposition extends FolderDisposition { |
@override |
final Packages packages; |
+ 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) { |
@@ -1468,18 +1501,12 @@ class PackagesFileDisposition extends FolderDisposition { |
return packageMap; |
} |
- PackagesFileDisposition(this.packages) {} |
- |
- @override |
- String get packageRoot => null; |
- |
@override |
Iterable<UriResolver> createPackageUriResolvers( |
ResourceProvider resourceProvider) { |
if (packages != null) { |
// Construct package map for the SdkExtUriResolver. |
- Map<String, List<Folder>> packageMap = |
- buildPackageMap(resourceProvider); |
+ Map<String, List<Folder>> packageMap = buildPackageMap(resourceProvider); |
return <UriResolver>[new SdkExtUriResolver(packageMap)]; |
} else { |
return const <UriResolver>[]; |