Unverified Commit 93eac884 authored by includecmath's avatar includecmath Committed by GitHub

[flutter_tools] Clean code analyze command (#60200)

parent 741608a2
...@@ -85,6 +85,24 @@ abstract class AnalyzeBase { ...@@ -85,6 +85,24 @@ abstract class AnalyzeBase {
} }
bool get isBenchmarking => argResults['benchmark'] as bool; bool get isBenchmarking => argResults['benchmark'] as bool;
static String generateDartDocMessage(int undocumentedMembers) {
String dartDocMessage;
assert(undocumentedMembers >= 0);
switch (undocumentedMembers) {
case 0:
dartDocMessage = 'all public member have documentation';
break;
case 1:
dartDocMessage = 'one public member lacks documentation';
break;
default:
dartDocMessage = '$undocumentedMembers public members lack documentation';
}
return dartDocMessage;
}
} }
class PackageDependency { class PackageDependency {
......
...@@ -20,7 +20,10 @@ import '../dart/analysis.dart'; ...@@ -20,7 +20,10 @@ import '../dart/analysis.dart';
import 'analyze_base.dart'; import 'analyze_base.dart';
class AnalyzeContinuously extends AnalyzeBase { class AnalyzeContinuously extends AnalyzeBase {
AnalyzeContinuously(ArgResults argResults, List<String> repoRoots, List<Directory> repoPackages, { AnalyzeContinuously(
ArgResults argResults,
List<String> repoRoots,
List<Directory> repoPackages, {
@required FileSystem fileSystem, @required FileSystem fileSystem,
@required Logger logger, @required Logger logger,
@required Terminal terminal, @required Terminal terminal,
...@@ -72,7 +75,9 @@ class AnalyzeContinuously extends AnalyzeBase { ...@@ -72,7 +75,9 @@ class AnalyzeContinuously extends AnalyzeBase {
final String sdkPath = argResults['dart-sdk'] as String ?? final String sdkPath = argResults['dart-sdk'] as String ??
artifacts.getArtifactPath(Artifact.engineDartSdkPath); artifacts.getArtifactPath(Artifact.engineDartSdkPath);
final AnalysisServer server = AnalysisServer(sdkPath, directories, final AnalysisServer server = AnalysisServer(
sdkPath,
directories,
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
platform: platform, platform: platform,
...@@ -159,20 +164,15 @@ class AnalyzeContinuously extends AnalyzeBase { ...@@ -159,20 +164,15 @@ class AnalyzeContinuously extends AnalyzeBase {
} else if (issueCount != 0) { } else if (issueCount != 0) {
errorsMessage = '$issueCount ${pluralize('issue', issueCount)} found'; errorsMessage = '$issueCount ${pluralize('issue', issueCount)} found';
} else { } else {
errorsMessage = 'no issues found'; errorsMessage = 'No issues found!';
} }
String dartdocMessage; final String dartDocMessage = AnalyzeBase.generateDartDocMessage(undocumentedMembers);
if (undocumentedMembers == 1) {
dartdocMessage = 'one public member lacks documentation';
} else {
dartdocMessage = '$undocumentedMembers public members lack documentation';
}
final String files = '${analyzedPaths.length} ${pluralize('file', analyzedPaths.length)}'; final String files = '${analyzedPaths.length} ${pluralize('file', analyzedPaths.length)}';
final String seconds = (analysisTimer.elapsedMilliseconds / 1000.0).toStringAsFixed(2); final String seconds = (analysisTimer.elapsedMilliseconds / 1000.0).toStringAsFixed(2);
if (undocumentedMembers > 0) { if (undocumentedMembers > 0) {
logger.printStatus('$errorsMessage$dartdocMessage • analyzed $files in $seconds seconds'); logger.printStatus('$errorsMessage$dartDocMessage • analyzed $files in $seconds seconds');
} else { } else {
logger.printStatus('$errorsMessage • analyzed $files in $seconds seconds'); logger.printStatus('$errorsMessage • analyzed $files in $seconds seconds');
} }
......
...@@ -16,10 +16,8 @@ import '../base/platform.dart'; ...@@ -16,10 +16,8 @@ import '../base/platform.dart';
import '../base/terminal.dart'; import '../base/terminal.dart';
import '../base/utils.dart'; import '../base/utils.dart';
import '../dart/analysis.dart'; import '../dart/analysis.dart';
import 'analyze.dart';
import 'analyze_base.dart'; import 'analyze_base.dart';
/// An aspect of the [AnalyzeCommand] to perform once time analysis.
class AnalyzeOnce extends AnalyzeBase { class AnalyzeOnce extends AnalyzeBase {
AnalyzeOnce( AnalyzeOnce(
ArgResults argResults, ArgResults argResults,
...@@ -87,7 +85,6 @@ class AnalyzeOnce extends AnalyzeBase { ...@@ -87,7 +85,6 @@ class AnalyzeOnce extends AnalyzeBase {
throwToolExit('Nothing to analyze.', exitCode: 0); throwToolExit('Nothing to analyze.', exitCode: 0);
} }
// analyze all
final Completer<void> analysisCompleter = Completer<void>(); final Completer<void> analysisCompleter = Completer<void>();
final List<AnalysisError> errors = <AnalysisError>[]; final List<AnalysisError> errors = <AnalysisError>[];
...@@ -109,17 +106,24 @@ class AnalyzeOnce extends AnalyzeBase { ...@@ -109,17 +106,24 @@ class AnalyzeOnce extends AnalyzeBase {
Status progress; Status progress;
try { try {
StreamSubscription<bool> subscription; StreamSubscription<bool> subscription;
subscription = server.onAnalyzing.listen((bool isAnalyzing) {
void handleAnalysisStatus(bool isAnalyzing) {
if (!isAnalyzing) { if (!isAnalyzing) {
analysisCompleter.complete(); analysisCompleter.complete();
subscription?.cancel(); subscription?.cancel();
subscription = null; subscription = null;
} }
}); }
server.onErrors.listen((FileAnalysisErrors fileErrors) {
// Record the issues found (but filter out to do comments). subscription = server.onAnalyzing.listen((bool isAnalyzing) => handleAnalysisStatus(isAnalyzing));
errors.addAll(fileErrors.errors.where((AnalysisError error) => error.type != 'TODO'));
}); void handleAnalysisErrors(FileAnalysisErrors fileErrors) {
fileErrors.errors.removeWhere((AnalysisError error) => error.type == 'TODO');
errors.addAll(fileErrors.errors);
}
server.onErrors.listen(handleAnalysisErrors);
await server.start(); await server.start();
// Completing the future in the callback can't fail. // Completing the future in the callback can't fail.
...@@ -175,19 +179,14 @@ class AnalyzeOnce extends AnalyzeBase { ...@@ -175,19 +179,14 @@ class AnalyzeOnce extends AnalyzeBase {
final String seconds = (timer.elapsedMilliseconds / 1000.0).toStringAsFixed(1); final String seconds = (timer.elapsedMilliseconds / 1000.0).toStringAsFixed(1);
String dartdocMessage; final String dartDocMessage = AnalyzeBase.generateDartDocMessage(undocumentedMembers);
if (undocumentedMembers == 1) {
dartdocMessage = 'one public member lacks documentation';
} else {
dartdocMessage = '$undocumentedMembers public members lack documentation';
}
// We consider any level of error to be an error exit (we don't report different levels). // We consider any level of error to be an error exit (we don't report different levels).
if (errors.isNotEmpty) { if (errors.isNotEmpty) {
final int errorCount = errors.length; final int errorCount = errors.length;
logger.printStatus(''); logger.printStatus('');
if (undocumentedMembers > 0) { if (undocumentedMembers > 0) {
throwToolExit('$errorCount ${pluralize('issue', errorCount)} found. (ran in ${seconds}s; $dartdocMessage)'); throwToolExit('$errorCount ${pluralize('issue', errorCount)} found. (ran in ${seconds}s; $dartDocMessage)');
} else { } else {
throwToolExit('$errorCount ${pluralize('issue', errorCount)} found. (ran in ${seconds}s)'); throwToolExit('$errorCount ${pluralize('issue', errorCount)} found. (ran in ${seconds}s)');
} }
...@@ -199,7 +198,7 @@ class AnalyzeOnce extends AnalyzeBase { ...@@ -199,7 +198,7 @@ class AnalyzeOnce extends AnalyzeBase {
if (argResults['congratulate'] as bool) { if (argResults['congratulate'] as bool) {
if (undocumentedMembers > 0) { if (undocumentedMembers > 0) {
logger.printStatus('No issues found! (ran in ${seconds}s; $dartdocMessage)'); logger.printStatus('No issues found! (ran in ${seconds}s; $dartDocMessage)');
} else { } else {
logger.printStatus('No issues found! (ran in ${seconds}s)'); logger.printStatus('No issues found! (ran in ${seconds}s)');
} }
......
...@@ -5,12 +5,19 @@ ...@@ -5,12 +5,19 @@
import 'package:file/file.dart'; import 'package:file/file.dart';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/analyze_base.dart';
import '../../src/common.dart'; import '../../src/common.dart';
const String _kFlutterRoot = '/data/flutter'; const String _kFlutterRoot = '/data/flutter';
void main() { void main() {
testWithoutContext('analyze generate correct DartDoc message', () async {
expect(AnalyzeBase.generateDartDocMessage(0), 'all public member have documentation');
expect(AnalyzeBase.generateDartDocMessage(1), 'one public member lacks documentation');
expect(AnalyzeBase.generateDartDocMessage(2), '2 public members lack documentation');
});
testWithoutContext('analyze inRepo', () { testWithoutContext('analyze inRepo', () {
final FileSystem fileSystem = MemoryFileSystem.test(); final FileSystem fileSystem = MemoryFileSystem.test();
fileSystem.directory(_kFlutterRoot).createSync(recursive: true); fileSystem.directory(_kFlutterRoot).createSync(recursive: true);
......
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