fix dartanalyzer sdk setup
Separate analysis options initialization from context setup
so that analysis options can be used to correctly setup the SDK
in strong mode.
Fix https://github.com/dart-lang/sdk/issues/28507
R=brianwilkerson@google.com
Review-Url: https://codereview.chromium.org/2678633002 .
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index e77699f..cab1e4c 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/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';
@@ -361,25 +360,30 @@
/// 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);
}
}
@@ -421,16 +425,18 @@
// '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.
@@ -506,9 +512,6 @@
_analyzedFileCount += _context.sources.length;
}
- // Create a context.
- _context = AnalysisEngine.instance.createAnalysisContext();
-
// Find package info.
_PackageInfo packageInfo = _findPackages(options);
@@ -531,8 +534,18 @@
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) {
@@ -541,17 +554,12 @@
// Choose a package resolution policy and a diet parsing policy based on
// the command-line options.
- SourceFactory sourceFactory = _chooseUriResolutionPolicy(
- options, embedderMap, packageInfo, summaryDataStore);
+ SourceFactory sourceFactory = _chooseUriResolutionPolicy(options,
+ embedderMap, packageInfo, summaryDataStore, true, analysisOptions);
- AnalyzeFunctionBodiesPredicate dietParsingPolicy =
- _chooseDietParsingPolicy(options);
- setAnalysisContextOptions(
- resourceProvider, sourceFactory, _context, options,
- (AnalysisOptionsImpl contextOptions) {
- contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy;
- });
-
+ // Create a context.
+ _context = AnalysisEngine.instance.createAnalysisContext();
+ setupAnalysisContext(_context, options, analysisOptions);
_context.sourceFactory = sourceFactory;
if (options.enableNewAnalysisDriver) {
@@ -683,7 +691,8 @@
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(
@@ -698,8 +707,7 @@
sourcePath = path.normalize(sourcePath);
return !path.isWithin(dartSdkPath, sourcePath);
});
-
- dartSdk.analysisOptions = context.analysisOptions;
+ dartSdk.analysisOptions = analysisOptions;
sdk = dartSdk;
}
}
@@ -722,12 +730,34 @@
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;
@@ -740,16 +770,8 @@
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.
@@ -807,7 +829,7 @@
static void _processAnalysisOptions(
file_system.ResourceProvider resourceProvider,
SourceFactory sourceFactory,
- AnalysisContext context,
+ AnalysisOptionsImpl analysisOptions,
CommandLineOptions options) {
file_system.File file = _getOptionsFile(resourceProvider, options);
@@ -819,12 +841,12 @@
// 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);
}
}
}
diff --git a/pkg/analyzer_cli/test/data/strong_sdk/main.dart b/pkg/analyzer_cli/test/data/strong_sdk/main.dart
new file mode 100644
index 0000000..34b0c4c
--- /dev/null
+++ b/pkg/analyzer_cli/test/data/strong_sdk/main.dart
@@ -0,0 +1,7 @@
+import 'dart:js';
+
+typedef dynamic Func(String x, String y);
+
+Func bar(Func f) {
+ return allowInterop(f);
+}
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index ca07498..0a379c4 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -322,6 +322,14 @@
expect(outSink.toString(), contains('isn\'t defined'));
expect(outSink.toString(), contains('Avoid empty else statements.'));
});
+
+ test('test strong SDK', () async {
+ String testDir = path.join(testDirectory, 'data', 'strong_sdk');
+ await drive(path.join(testDir, 'main.dart'), args: ['--strong']);
+ expect(driver.context.analysisOptions.strongMode, isTrue);
+ expect(outSink.toString(), contains('No issues found'));
+ expect(exitCode, 0);
+ });
});
void createTests(String designator, String optionsFileName) {
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index eaa790a..37b1d767 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -73,7 +73,7 @@
print('stderr:');
print(errorSink);
}
- throw e;
+ rethrow;
}
};
}