[flutter_tools] support files in flutter analyze #96231 (#97021)

This commit is contained in:
Jesús S Guerrero 2022-01-24 17:10:16 -08:00 committed by GitHub
parent 2978629eb2
commit 75127a8007
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 21 deletions

View file

@ -48,17 +48,15 @@ class AnalyzeOnce extends AnalyzeBase {
final String currentDirectory =
(workingDirectory ?? fileSystem.currentDirectory).path;
// find directories from argResults.rest
final Set<String> directories = Set<String>.of(argResults.rest
// find directories or files from argResults.rest
final Set<String> items = Set<String>.of(argResults.rest
.map<String>((String path) => fileSystem.path.canonicalize(path)));
if (directories.isNotEmpty) {
for (final String directory in directories) {
final FileSystemEntityType type = fileSystem.typeSync(directory);
if (items.isNotEmpty) {
for (final String item in items) {
final FileSystemEntityType type = fileSystem.typeSync(item);
if (type == FileSystemEntityType.notFound) {
throwToolExit("'$directory' does not exist");
} else if (type != FileSystemEntityType.directory) {
throwToolExit("'$directory' is not a directory");
throwToolExit("'$item' does not exist");
}
}
}
@ -67,17 +65,17 @@ class AnalyzeOnce extends AnalyzeBase {
// check for conflicting dependencies
final PackageDependencyTracker dependencies = PackageDependencyTracker();
dependencies.checkForConflictingDependencies(repoPackages, dependencies);
directories.addAll(repoRoots);
items.addAll(repoRoots);
if (argResults.wasParsed('current-package') && (argResults['current-package'] as bool)) {
directories.add(currentDirectory);
items.add(currentDirectory);
}
} else {
if (argResults['current-package'] as bool) {
directories.add(currentDirectory);
if ((argResults['current-package'] as bool) && items.isEmpty) {
items.add(currentDirectory);
}
}
if (directories.isEmpty) {
if (items.isEmpty) {
throwToolExit('Nothing to analyze.', exitCode: 0);
}
@ -86,7 +84,7 @@ class AnalyzeOnce extends AnalyzeBase {
final AnalysisServer server = AnalysisServer(
sdkPath,
directories.toList(),
items.toList(),
fileSystem: fileSystem,
platform: platform,
logger: logger,
@ -133,9 +131,9 @@ class AnalyzeOnce extends AnalyzeBase {
// collect results
timer = Stopwatch()..start();
final String message = directories.length > 1
? '${directories.length} ${directories.length == 1 ? 'directory' : 'directories'}'
: fileSystem.path.basename(directories.first);
final String message = items.length > 1
? '${items.length} ${items.length == 1 ? 'item' : 'items'}'
: fileSystem.path.basename(items.first);
progress = argResults['preamble'] == true
? logger.startProgress(
'Analyzing $message...',

View file

@ -13,6 +13,7 @@ void main() {
late Directory tempDir;
late String projectPath;
late File libMain;
late File errorFile;
Future<void> runCommand({
List<String> arguments = const <String>[],
@ -79,6 +80,7 @@ void main() {
setUp(() {
tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analyze_once_test_1.').absolute;
projectPath = fileSystem.path.join(tempDir.path, 'flutter_project');
final String projectWithErrors = fileSystem.path.join(tempDir.path, 'flutter_project_errors');
fileSystem.file(fileSystem.path.join(projectPath, 'pubspec.yaml'))
..createSync(recursive: true)
..writeAsStringSync(pubspecYamlSrc);
@ -86,6 +88,9 @@ void main() {
libMain = fileSystem.file(fileSystem.path.join(projectPath, 'lib', 'main.dart'))
..createSync(recursive: true)
..writeAsStringSync(mainDartSrc);
errorFile = fileSystem.file(fileSystem.path.join(projectWithErrors, 'other', 'error.dart'))
..createSync(recursive: true)
..writeAsStringSync(r"""import 'package:flutter/material.dart""");
});
tearDown(() {
@ -100,12 +105,63 @@ void main() {
);
});
// testWithoutContext a specific file outside the current directory
testWithoutContext('passing one file throws', () async {
testWithoutContext('passing one file works', () async {
await runCommand(
arguments: <String>['analyze', '--no-pub', libMain.path],
exitMessageContains: 'is not a directory',
exitCode: 1,
statusTextContains: <String>['No issues found!']
);
});
testWithoutContext('passing one file with errors are detected', () async {
await runCommand(
arguments: <String>['analyze', '--no-pub', errorFile.path],
statusTextContains: <String>[
'Analyzing error.dart',
"error $analyzerSeparator Target of URI doesn't exist",
"error $analyzerSeparator Expected to find ';'",
'error $analyzerSeparator Unterminated string literal'
],
exitMessageContains: '3 issues found',
exitCode: 1
);
});
testWithoutContext('passing more than one file with errors', () async {
await runCommand(
arguments: <String>['analyze', '--no-pub', libMain.path, errorFile.path],
statusTextContains: <String>[
'Analyzing 2 items',
"error $analyzerSeparator Target of URI doesn't exist",
"error $analyzerSeparator Expected to find ';'",
'error $analyzerSeparator Unterminated string literal'
],
exitMessageContains: '3 issues found',
exitCode: 1
);
});
testWithoutContext('passing more than one file success', () async {
final File secondFile = fileSystem.file(fileSystem.path.join(projectPath, 'lib', 'second.dart'))
..createSync(recursive: true)
..writeAsStringSync('');
await runCommand(
arguments: <String>['analyze', '--no-pub', libMain.path, secondFile.path],
statusTextContains: <String>['No issues found!']
);
});
testWithoutContext('mixing directory and files success', () async {
await runCommand(
arguments: <String>['analyze', '--no-pub', libMain.path, projectPath],
statusTextContains: <String>['No issues found!']
);
});
testWithoutContext('file not found', () async {
await runCommand(
arguments: <String>['analyze', '--no-pub', 'not_found.abc'],
exitMessageContains: "not_found.abc' does not exist",
exitCode: 1
);
});