| 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>[];
|
|
|