From 78f688eb4b482d87da53acfb5d78cff146b7fff8 Mon Sep 17 00:00:00 2001 From: ookami-kb Date: Sat, 30 Apr 2022 18:19:18 +0200 Subject: [PATCH] feat: remove declaration in prefer-immediate-return --- CHANGELOG.md | 1 + .../prefer_immediate_return_rule.dart | 35 ++++++++++------ .../prefer_immediate_return/visitor.dart | 6 +-- lib/src/utils/node_utils.dart | 3 +- .../prefer_immediate_return_rule_test.dart | 42 ++++++++++++------- 5 files changed, 57 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8bac6246f..43fe80552f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased * fix: dart-code-metrics crash saying `Bad state: No element` when running command. +* feat: remove declaration in prefer-immediate-return ## 4.14.0 diff --git a/lib/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/prefer_immediate_return_rule.dart b/lib/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/prefer_immediate_return_rule.dart index 22198378a5..12d468a900 100644 --- a/lib/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/prefer_immediate_return_rule.dart +++ b/lib/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/prefer_immediate_return_rule.dart @@ -32,18 +32,29 @@ class PreferImmediateReturnRule extends CommonRule { final visitor = _Visitor(); source.unit.visitChildren(visitor); - return visitor.issues - .map( - (issue) => createIssue( - rule: this, - location: nodeLocation(node: issue.returnStatement, source: source), - message: _warningMessage, - replacement: Replacement( - comment: _replaceComment, - replacement: 'return ${issue.variableDeclarationInitializer};', - ), + return visitor.issues.map( + (issue) { + AstNode? getSingleDeclarationNode() { + final declarationList = + issue.variableDeclaration.parent as VariableDeclarationList; + + return declarationList.variables.length == 1 ? declarationList : null; + } + + return createIssue( + rule: this, + location: nodeLocation( + node: getSingleDeclarationNode() ?? issue.returnStatement, + endNode: issue.returnStatement, + source: source, ), - ) - .toList(growable: false); + message: _warningMessage, + replacement: Replacement( + comment: _replaceComment, + replacement: 'return ${issue.variableDeclaration.initializer};', + ), + ); + }, + ).toList(growable: false); } } diff --git a/lib/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/visitor.dart b/lib/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/visitor.dart index 006fba2472..691791133e 100644 --- a/lib/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/visitor.dart +++ b/lib/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/visitor.dart @@ -33,7 +33,7 @@ class _Visitor extends RecursiveAstVisitor { } _issues.add(_IssueDetails( - lastDeclaredVariable.initializer, + lastDeclaredVariable, returnStatement, )); } @@ -41,10 +41,10 @@ class _Visitor extends RecursiveAstVisitor { class _IssueDetails { const _IssueDetails( - this.variableDeclarationInitializer, + this.variableDeclaration, this.returnStatement, ); - final Expression? variableDeclarationInitializer; + final VariableDeclaration variableDeclaration; final ReturnStatement returnStatement; } diff --git a/lib/src/utils/node_utils.dart b/lib/src/utils/node_utils.dart index 5fe79c60df..adbeffb952 100644 --- a/lib/src/utils/node_utils.dart +++ b/lib/src/utils/node_utils.dart @@ -8,12 +8,13 @@ import '../analyzers/lint_analyzer/models/internal_resolved_unit_result.dart'; SourceSpan nodeLocation({ required SyntacticEntity node, required InternalResolvedUnitResult source, + SyntacticEntity? endNode, bool withCommentOrMetadata = false, }) { final offset = !withCommentOrMetadata && node is AnnotatedNode ? node.firstTokenAfterCommentAndMetadata.offset : node.offset; - final end = node.end; + final end = endNode?.end ?? node.end; final sourceUrl = Uri.file(source.path); final offsetLocation = source.lineInfo.getLocation(offset); diff --git a/test/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/prefer_immediate_return_rule_test.dart b/test/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/prefer_immediate_return_rule_test.dart index 080a897d95..0a95776709 100644 --- a/test/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/prefer_immediate_return_rule_test.dart +++ b/test/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/prefer_immediate_return_rule_test.dart @@ -28,15 +28,15 @@ void main() { RuleTestHelper.verifyIssues( issues: issues, startLines: [ - 4, + 2, 10, 16, - 23, - 30, - 49, - 53, - 63, - 68, + 21, + 28, + 47, + 51, + 61, + 66, ], startColumns: [ 3, @@ -83,15 +83,29 @@ void main() { 'return a + b;', ], locationTexts: [ + 'final sum = a + b;\n' + '\n' + ' return sum;', 'return sum;', 'return sum;', - 'return sum;', - 'return result;', - 'return x;', - 'return sum;', - 'return sum;', - 'return result;', - 'return result;', + 'final result = width * height;\n' + '\n' + ' return result;', + 'final String? x;\n' + '\n' + ' return x;', + 'final sum = a + b;\n' + '\n' + ' return sum;', + 'final sum = 0;\n' + '\n' + ' return sum;', + 'final result = a * b;\n' + '\n' + ' return result;', + 'final result = a + b;\n' + '\n' + ' return result;', ], ); });