Index: pkg/analyzer_cli/lib/src/driver.dart |
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart |
index 49ba67fce572f47b57dabab3b1f3fc7a39944010..e91d07ef262d6373d7af382528fca49a2114cbd7 100644 |
--- a/pkg/analyzer_cli/lib/src/driver.dart |
+++ b/pkg/analyzer_cli/lib/src/driver.dart |
@@ -33,7 +33,6 @@ import 'package:analyzer/src/generated/source_io.dart'; |
import 'package:analyzer/src/generated/utilities_general.dart' |
show PerformanceTag; |
import 'package:analyzer/src/lint/registry.dart'; |
-import 'package:analyzer/src/services/lint.dart'; |
import 'package:analyzer/src/source/source_resource.dart'; |
import 'package:analyzer/src/summary/idl.dart'; |
import 'package:analyzer/src/summary/package_bundle_reader.dart'; |
@@ -364,25 +363,30 @@ class Driver implements CommandLineStarter { |
/// Decide on the appropriate method for resolving URIs based on the given |
/// [options] and [customUrlMappings] settings, and return a |
/// [SourceFactory] that has been configured accordingly. |
+ /// When [includeSdkResolver] is `false`, return a temporary [SourceFactory] |
+ /// for the purpose of resolved analysis options file `include:` directives. |
+ /// In this situation, [analysisOptions] is ignored and can be `null`. |
SourceFactory _chooseUriResolutionPolicy( |
CommandLineOptions options, |
Map<file_system.Folder, YamlMap> embedderMap, |
_PackageInfo packageInfo, |
- SummaryDataStore summaryDataStore) { |
+ SummaryDataStore summaryDataStore, |
+ bool includeSdkResolver, |
+ AnalysisOptions analysisOptions) { |
// Create a custom package resolver if one has been specified. |
if (packageResolverProvider != null) { |
file_system.Folder folder = resourceProvider.getResource('.'); |
UriResolver resolver = packageResolverProvider(folder); |
if (resolver != null) { |
- UriResolver sdkResolver = new DartUriResolver(sdk); |
- |
// TODO(brianwilkerson) This doesn't handle sdk extensions. |
- List<UriResolver> resolvers = <UriResolver>[ |
- sdkResolver, |
- new InSummaryUriResolver(resourceProvider, summaryDataStore), |
- resolver, |
- new file_system.ResourceUriResolver(resourceProvider) |
- ]; |
+ List<UriResolver> resolvers = <UriResolver>[]; |
+ if (includeSdkResolver) { |
+ resolvers.add(new DartUriResolver(sdk)); |
+ } |
+ resolvers |
+ .add(new InSummaryUriResolver(resourceProvider, summaryDataStore)); |
+ resolvers.add(resolver); |
+ resolvers.add(new file_system.ResourceUriResolver(resourceProvider)); |
return new SourceFactory(resolvers); |
} |
} |
@@ -424,16 +428,18 @@ class Driver implements CommandLineStarter { |
// 'dart:' URIs come first. |
// Setup embedding. |
- EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderMap); |
- if (embedderSdk.libraryMap.size() == 0) { |
- // The embedder uri resolver has no mappings. Use the default Dart SDK |
- // uri resolver. |
- resolvers.add(new DartUriResolver(sdk)); |
- } else { |
- // The embedder uri resolver has mappings, use it instead of the default |
- // Dart SDK uri resolver. |
- embedderSdk.analysisOptions = _context.analysisOptions; |
- resolvers.add(new DartUriResolver(embedderSdk)); |
+ if (includeSdkResolver) { |
+ EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderMap); |
+ if (embedderSdk.libraryMap.size() == 0) { |
+ // The embedder uri resolver has no mappings. Use the default Dart SDK |
+ // uri resolver. |
+ resolvers.add(new DartUriResolver(sdk)); |
+ } else { |
+ // The embedder uri resolver has mappings, use it instead of the default |
+ // Dart SDK uri resolver. |
+ embedderSdk.analysisOptions = analysisOptions; |
+ resolvers.add(new DartUriResolver(embedderSdk)); |
+ } |
} |
// Next SdkExts. |
@@ -509,9 +515,6 @@ class Driver implements CommandLineStarter { |
_analyzedFileCount += _context.sources.length; |
} |
- // Create a context. |
- _context = AnalysisEngine.instance.createAnalysisContext(); |
- |
// Find package info. |
_PackageInfo packageInfo = _findPackages(options); |
@@ -534,8 +537,18 @@ class Driver implements CommandLineStarter { |
SummaryDataStore summaryDataStore = new SummaryDataStore( |
useSummaries ? options.buildSummaryInputs : <String>[]); |
+ // Create a temporary source factory without an SDK resolver |
+ // for resolving "include:" directives in analysis options files. |
+ SourceFactory tempSourceFactory = _chooseUriResolutionPolicy( |
+ options, embedderMap, packageInfo, summaryDataStore, false, null); |
+ |
+ AnalysisOptionsImpl analysisOptions = |
+ createAnalysisOptions(resourceProvider, tempSourceFactory, options); |
+ analysisOptions.analyzeFunctionBodiesPredicate = |
+ _chooseDietParsingPolicy(options); |
+ |
// Once options and embedders are processed, setup the SDK. |
- _setupSdk(options, useSummaries); |
+ _setupSdk(options, useSummaries, analysisOptions); |
PackageBundle sdkBundle = sdk.getLinkedBundle(); |
if (sdkBundle != null) { |
@@ -544,17 +557,12 @@ class Driver implements CommandLineStarter { |
// Choose a package resolution policy and a diet parsing policy based on |
// the command-line options. |
- SourceFactory sourceFactory = _chooseUriResolutionPolicy( |
- options, embedderMap, packageInfo, summaryDataStore); |
- |
- AnalyzeFunctionBodiesPredicate dietParsingPolicy = |
- _chooseDietParsingPolicy(options); |
- setAnalysisContextOptions( |
- resourceProvider, sourceFactory, _context, options, |
- (AnalysisOptionsImpl contextOptions) { |
- contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy; |
- }); |
+ SourceFactory sourceFactory = _chooseUriResolutionPolicy(options, |
+ embedderMap, packageInfo, summaryDataStore, true, analysisOptions); |
+ // Create a context. |
+ _context = AnalysisEngine.instance.createAnalysisContext(); |
+ setupAnalysisContext(_context, options, analysisOptions); |
_context.sourceFactory = sourceFactory; |
if (options.enableNewAnalysisDriver) { |
@@ -686,7 +694,8 @@ class Driver implements CommandLineStarter { |
return errorSeverity; |
} |
- void _setupSdk(CommandLineOptions options, bool useSummaries) { |
+ void _setupSdk(CommandLineOptions options, bool useSummaries, |
+ AnalysisOptions analysisOptions) { |
if (sdk == null) { |
if (options.dartSdkSummaryPath != null) { |
sdk = new SummaryBasedDartSdk( |
@@ -701,8 +710,7 @@ class Driver implements CommandLineStarter { |
sourcePath = path.normalize(sourcePath); |
return !path.isWithin(dartSdkPath, sourcePath); |
}); |
- |
- dartSdk.analysisOptions = context.analysisOptions; |
+ dartSdk.analysisOptions = analysisOptions; |
sdk = dartSdk; |
} |
} |
@@ -725,12 +733,34 @@ class Driver implements CommandLineStarter { |
return contextOptions; |
} |
+ static AnalysisOptionsImpl createAnalysisOptions( |
+ file_system.ResourceProvider resourceProvider, |
+ SourceFactory sourceFactory, |
+ CommandLineOptions options) { |
+ // Prepare context options. |
+ AnalysisOptionsImpl analysisOptions = |
+ createAnalysisOptionsForCommandLineOptions(options); |
+ |
+ // Process analysis options file (and notify all interested parties). |
+ _processAnalysisOptions( |
+ resourceProvider, sourceFactory, analysisOptions, options); |
+ return analysisOptions; |
+ } |
+ |
static void setAnalysisContextOptions( |
file_system.ResourceProvider resourceProvider, |
SourceFactory sourceFactory, |
AnalysisContext context, |
CommandLineOptions options, |
void configureContextOptions(AnalysisOptionsImpl contextOptions)) { |
+ AnalysisOptionsImpl analysisOptions = |
+ createAnalysisOptions(resourceProvider, sourceFactory, options); |
+ configureContextOptions(analysisOptions); |
+ setupAnalysisContext(context, options, analysisOptions); |
+ } |
+ |
+ static void setupAnalysisContext(AnalysisContext context, |
+ CommandLineOptions options, AnalysisOptionsImpl analysisOptions) { |
Map<String, String> definedVariables = options.definedVariables; |
if (definedVariables.isNotEmpty) { |
DeclaredVariables declaredVariables = context.declaredVariables; |
@@ -743,16 +773,8 @@ class Driver implements CommandLineStarter { |
AnalysisEngine.instance.logger = new StdLogger(); |
} |
- // Prepare context options. |
- AnalysisOptionsImpl contextOptions = |
- createAnalysisOptionsForCommandLineOptions(options); |
- configureContextOptions(contextOptions); |
- |
// Set context options. |
- context.analysisOptions = contextOptions; |
- |
- // Process analysis options file (and notify all interested parties). |
- _processAnalysisOptions(resourceProvider, sourceFactory, context, options); |
+ context.analysisOptions = analysisOptions; |
} |
/// Perform a deep comparison of two string lists. |
@@ -810,7 +832,7 @@ class Driver implements CommandLineStarter { |
static void _processAnalysisOptions( |
file_system.ResourceProvider resourceProvider, |
SourceFactory sourceFactory, |
- AnalysisContext context, |
+ AnalysisOptionsImpl analysisOptions, |
CommandLineOptions options) { |
file_system.File file = _getOptionsFile(resourceProvider, options); |
@@ -822,12 +844,12 @@ class Driver implements CommandLineStarter { |
// Fill in lint rule defaults in case lints are enabled and rules are |
// not specified in an options file. |
if (options.lints && !containsLintRuleEntry(optionMap)) { |
- setLints(context, Registry.ruleRegistry.defaultRules); |
+ analysisOptions.lintRules = Registry.ruleRegistry.defaultRules; |
} |
// Ask engine to further process options. |
if (optionMap != null) { |
- applyToAnalysisOptions(context.analysisOptions, optionMap); |
+ applyToAnalysisOptions(analysisOptions, optionMap); |
} |
} |
} |