Unverified Commit 75127a80 authored by Jesús S Guerrero's avatar Jesús S Guerrero Committed by GitHub

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

parent 2978629e
...@@ -48,17 +48,15 @@ class AnalyzeOnce extends AnalyzeBase { ...@@ -48,17 +48,15 @@ class AnalyzeOnce extends AnalyzeBase {
final String currentDirectory = final String currentDirectory =
(workingDirectory ?? fileSystem.currentDirectory).path; (workingDirectory ?? fileSystem.currentDirectory).path;
// find directories from argResults.rest // find directories or files from argResults.rest
final Set<String> directories = Set<String>.of(argResults.rest final Set<String> items = Set<String>.of(argResults.rest
.map<String>((String path) => fileSystem.path.canonicalize(path))); .map<String>((String path) => fileSystem.path.canonicalize(path)));
if (directories.isNotEmpty) { if (items.isNotEmpty) {
for (final String directory in directories) { for (final String item in items) {
final FileSystemEntityType type = fileSystem.typeSync(directory); final FileSystemEntityType type = fileSystem.typeSync(item);
if (type == FileSystemEntityType.notFound) { if (type == FileSystemEntityType.notFound) {
throwToolExit("'$directory' does not exist"); throwToolExit("'$item' does not exist");
} else if (type != FileSystemEntityType.directory) {
throwToolExit("'$directory' is not a directory");
} }
} }
} }
...@@ -67,17 +65,17 @@ class AnalyzeOnce extends AnalyzeBase { ...@@ -67,17 +65,17 @@ class AnalyzeOnce extends AnalyzeBase {
// check for conflicting dependencies // check for conflicting dependencies
final PackageDependencyTracker dependencies = PackageDependencyTracker(); final PackageDependencyTracker dependencies = PackageDependencyTracker();
dependencies.checkForConflictingDependencies(repoPackages, dependencies); dependencies.checkForConflictingDependencies(repoPackages, dependencies);
directories.addAll(repoRoots); items.addAll(repoRoots);
if (argResults.wasParsed('current-package') && (argResults['current-package'] as bool)) { if (argResults.wasParsed('current-package') && (argResults['current-package'] as bool)) {
directories.add(currentDirectory); items.add(currentDirectory);
} }
} else { } else {
if (argResults['current-package'] as bool) { if ((argResults['current-package'] as bool) && items.isEmpty) {
directories.add(currentDirectory); items.add(currentDirectory);
} }
} }
if (directories.isEmpty) { if (items.isEmpty) {
throwToolExit('Nothing to analyze.', exitCode: 0); throwToolExit('Nothing to analyze.', exitCode: 0);
} }
...@@ -86,7 +84,7 @@ class AnalyzeOnce extends AnalyzeBase { ...@@ -86,7 +84,7 @@ class AnalyzeOnce extends AnalyzeBase {
final AnalysisServer server = AnalysisServer( final AnalysisServer server = AnalysisServer(
sdkPath, sdkPath,
directories.toList(), items.toList(),
fileSystem: fileSystem, fileSystem: fileSystem,
platform: platform, platform: platform,
logger: logger, logger: logger,
...@@ -133,9 +131,9 @@ class AnalyzeOnce extends AnalyzeBase { ...@@ -133,9 +131,9 @@ class AnalyzeOnce extends AnalyzeBase {
// collect results // collect results
timer = Stopwatch()..start(); timer = Stopwatch()..start();
final String message = directories.length > 1 final String message = items.length > 1
? '${directories.length} ${directories.length == 1 ? 'directory' : 'directories'}' ? '${items.length} ${items.length == 1 ? 'item' : 'items'}'
: fileSystem.path.basename(directories.first); : fileSystem.path.basename(items.first);
progress = argResults['preamble'] == true progress = argResults['preamble'] == true
? logger.startProgress( ? logger.startProgress(
'Analyzing $message...', 'Analyzing $message...',
......
...@@ -13,6 +13,7 @@ void main() { ...@@ -13,6 +13,7 @@ void main() {
late Directory tempDir; late Directory tempDir;
late String projectPath; late String projectPath;
late File libMain; late File libMain;
late File errorFile;
Future<void> runCommand({ Future<void> runCommand({
List<String> arguments = const <String>[], List<String> arguments = const <String>[],
...@@ -79,6 +80,7 @@ void main() { ...@@ -79,6 +80,7 @@ void main() {
setUp(() { setUp(() {
tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analyze_once_test_1.').absolute; tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analyze_once_test_1.').absolute;
projectPath = fileSystem.path.join(tempDir.path, 'flutter_project'); 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')) fileSystem.file(fileSystem.path.join(projectPath, 'pubspec.yaml'))
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync(pubspecYamlSrc); ..writeAsStringSync(pubspecYamlSrc);
...@@ -86,6 +88,9 @@ void main() { ...@@ -86,6 +88,9 @@ void main() {
libMain = fileSystem.file(fileSystem.path.join(projectPath, 'lib', 'main.dart')) libMain = fileSystem.file(fileSystem.path.join(projectPath, 'lib', 'main.dart'))
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync(mainDartSrc); ..writeAsStringSync(mainDartSrc);
errorFile = fileSystem.file(fileSystem.path.join(projectWithErrors, 'other', 'error.dart'))
..createSync(recursive: true)
..writeAsStringSync(r"""import 'package:flutter/material.dart""");
}); });
tearDown(() { tearDown(() {
...@@ -100,12 +105,63 @@ void main() { ...@@ -100,12 +105,63 @@ void main() {
); );
}); });
// testWithoutContext a specific file outside the current directory testWithoutContext('passing one file works', () async {
testWithoutContext('passing one file throws', () async {
await runCommand( await runCommand(
arguments: <String>['analyze', '--no-pub', libMain.path], arguments: <String>['analyze', '--no-pub', libMain.path],
exitMessageContains: 'is not a directory', statusTextContains: <String>['No issues found!']
exitCode: 1, );
});
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
); );
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment