Add support for analyzing analysis options and pubspec files

Change-Id: I2aa05e5822b2993d0f1e903396c816b52e2292b4
Reviewed-on: https://dart-review.googlesource.com/41566
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Brian Wilkerson 2018-02-14 22:50:05 +00:00 committed by commit-bot@chromium.org
parent b019045393
commit f5942a5ce0
2 changed files with 86 additions and 9 deletions

View file

@ -27,10 +27,12 @@ import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/source_io.dart';
import 'package:analyzer/src/generated/utilities_general.dart'
show PerformanceTag;
import 'package:analyzer/src/pubspec/pubspec_validator.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';
import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk;
import 'package:analyzer/src/task/options.dart';
import 'package:analyzer_cli/src/analyzer_impl.dart';
import 'package:analyzer_cli/src/batch_mode.dart';
import 'package:analyzer_cli/src/build_mode.dart';
@ -318,16 +320,52 @@ class Driver implements CommandLineStarter {
}
for (Source source in sourcesToAnalyze) {
SourceKind sourceKind = analysisDriver != null
? await analysisDriver.getSourceKind(source.fullName)
: context.computeKindOf(source);
if (sourceKind == SourceKind.PART) {
partSources.add(source);
continue;
if (analysisDriver != null &&
(source.shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE ||
source.shortName == AnalysisEngine.ANALYSIS_OPTIONS_FILE)) {
file_system.File file = resourceProvider.getFile(source.fullName);
String content = file.readAsStringSync();
LineInfo lineInfo = new LineInfo.fromContent(content);
List<AnalysisError> errors =
GenerateOptionsErrorsTask.analyzeAnalysisOptions(
file.createSource(), content, analysisDriver.sourceFactory);
formatter.formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
for (AnalysisError error in errors) {
allResult = allResult.max(determineProcessedSeverity(
error, options, _context.analysisOptions));
}
} else if (source.shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
try {
file_system.File file = resourceProvider.getFile(source.fullName);
String content = file.readAsStringSync();
YamlNode node = loadYamlNode(content);
if (node is YamlMap) {
PubspecValidator validator =
new PubspecValidator(resourceProvider, file.createSource());
LineInfo lineInfo = new LineInfo.fromContent(content);
List<AnalysisError> errors = validator.validate(node.nodes);
formatter
.formatErrors([new AnalysisErrorInfoImpl(errors, lineInfo)]);
for (AnalysisError error in errors) {
allResult = allResult.max(determineProcessedSeverity(
error, options, _context.analysisOptions));
}
}
} catch (exception) {
// If the file cannot be analyzed, ignore it.
}
} else {
SourceKind sourceKind = analysisDriver != null
? await analysisDriver.getSourceKind(source.fullName)
: context.computeKindOf(source);
if (sourceKind == SourceKind.PART) {
partSources.add(source);
continue;
}
ErrorSeverity status = await _runAnalyzer(source, options, formatter);
allResult = allResult.max(status);
libUris.add(source.uri);
}
ErrorSeverity status = await _runAnalyzer(source, options, formatter);
allResult = allResult.max(status);
libUris.add(source.uri);
}
formatter.flush();

View file

@ -35,6 +35,7 @@ main() {
defineReflectiveTests(LinterTest);
defineReflectiveTests(LinterTest_PreviewDart2);
defineReflectiveTests(LinterTest_UseCFE);
defineReflectiveTests(NonDartFilesTest);
defineReflectiveTests(OptionsTest);
defineReflectiveTests(OptionsTest_PreviewDart2);
defineReflectiveTests(OptionsTest_UseCFE);
@ -778,6 +779,44 @@ class LinterTest_UseCFE extends LinterTest {
bool get useCFE => true;
}
@reflectiveTest
class NonDartFilesTest extends BaseTest {
test_analysisOptionsYaml() async {
await withTempDirAsync((tempDir) async {
String filePath =
path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
new File(filePath).writeAsStringSync('''
analyzer:
string-mode: true
''');
await drive(filePath);
expect(
bulletToDash(outSink),
contains(
"warning - The option 'string-mode' isn't supported by 'analyzer'"));
expect(exitCode, 0);
});
}
test_pubspecYaml() async {
await withTempDirAsync((tempDir) async {
String filePath = path.join(tempDir, AnalysisEngine.PUBSPEC_YAML_FILE);
new File(filePath).writeAsStringSync('''
name: foo
flutter:
assets:
doesNotExist.gif
''');
await drive(filePath);
expect(
bulletToDash(outSink),
contains(
"warning - The value of the 'asset' field is expected to be a list of relative file paths"));
expect(exitCode, 0);
});
}
}
@reflectiveTest
class OptionsTest extends BaseTest {
String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;