Skip to content

Commit

Permalink
fix dartanalyzer sdk setup
Browse files Browse the repository at this point in the history
Separate analysis options initialization from context setup
so that analysis options can be used to correctly setup the SDK
in strong mode.

Fix #28507

R=brianwilkerson@google.com

Review-Url: https://codereview.chromium.org/2678633002 .
  • Loading branch information
danrubel committed Feb 4, 2017
1 parent de05077 commit 167107e
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 50 deletions.
120 changes: 71 additions & 49 deletions pkg/analyzer_cli/lib/src/driver.dart
Expand Up @@ -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';
Expand Down Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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);

Expand All @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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(
Expand All @@ -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;
}
}
Expand All @@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -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);

Expand All @@ -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);
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions 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);
}
8 changes: 8 additions & 0 deletions pkg/analyzer_cli/test/driver_test.dart
Expand Up @@ -322,6 +322,14 @@ linter:
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) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/analyzer_cli/test/embedder_test.dart
Expand Up @@ -73,7 +73,7 @@ Function wrap(Function f) {
print('stderr:');
print(errorSink);
}
throw e;
rethrow;
}
};
}

0 comments on commit 167107e

Please sign in to comment.