diff --git a/CHANGELOG.md b/CHANGELOG.md index cf07f5fb2b..e190cd2283 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,13 @@ ## Unreleased +* fix: cover more cases in [`prefer-immediate-return`](https://dartcodemetrics.dev/docs/rules/common/prefer-immediate-return) rule * fix: support index expressions for [`no-magic-number`](https://dartcodemetrics.dev/docs/rules/common/no-magic-number) rule. ## 4.13.0 * feat: add [Checkstyle](https://dartcodemetrics.dev/docs/cli/analyze#checkstyle) format reporter. -* feat: add [prefer-immediate-return](https://dartcodemetrics.dev/docs/rules/common/prefer-immediate-return) rule +* feat: add [`prefer-immediate-return`](https://dartcodemetrics.dev/docs/rules/common/prefer-immediate-return) rule ## 4.12.0 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 c55172e4be..e9133c198f 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 @@ -6,16 +6,16 @@ class _Visitor extends RecursiveAstVisitor { Iterable<_IssueDetails> get issues => _issues; @override - void visitBlockFunctionBody(BlockFunctionBody node) { - super.visitBlockFunctionBody(node); + void visitBlock(Block node) { + super.visitBlock(node); - if (node.block.statements.length < 2) { + if (node.statements.length < 2) { return; } final variableDeclarationStatement = - node.block.statements[node.block.statements.length - 2]; - final returnStatement = node.block.statements.last; + node.statements[node.statements.length - 2]; + final returnStatement = node.statements.last; if (variableDeclarationStatement is! VariableDeclarationStatement || returnStatement is! ReturnStatement) { return; diff --git a/test/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/examples/example.dart b/test/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/examples/example.dart index 44735e3884..8a1c3b1531 100644 --- a/test/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/examples/example.dart +++ b/test/src/analyzers/lint_analyzer/rules/rules_list/prefer_immediate_return/examples/example.dart @@ -41,3 +41,31 @@ int calculateSum(int a, int b) { return sum; // OK, "sum" variable not immediately preceding return statement } + +void calculateSum(int a, int b) { + try { + final sum = a + b; + + return sum; // LINT + } catch (e) { + final sum = 0; + + return sum; // LINT + } + + return 0; +} + +void calculateSomething(bool condition, int a, int b) { + for (var i = 0; i < 10; i++) { + final result = a * b; + + return result; // LINT + } + if (condition) { + final result = a + b; + + return result; // LINT + } + return 0; +} 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 c3bd1f750b..080a897d95 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 @@ -33,6 +33,10 @@ void main() { 16, 23, 30, + 49, + 53, + 63, + 68, ], startColumns: [ 3, @@ -40,6 +44,10 @@ void main() { 3, 5, 3, + 5, + 5, + 5, + 5, ], messages: [ 'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.', @@ -47,6 +55,10 @@ void main() { 'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.', 'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.', 'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.', + 'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.', + 'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.', + 'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.', + 'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.', ], replacementComments: [ 'Replace with immediate return.', @@ -54,6 +66,10 @@ void main() { 'Replace with immediate return.', 'Replace with immediate return.', 'Replace with immediate return.', + 'Replace with immediate return.', + 'Replace with immediate return.', + 'Replace with immediate return.', + 'Replace with immediate return.', ], replacements: [ 'return a + b;', @@ -61,6 +77,10 @@ void main() { 'return a + b;', 'return width * height;', 'return null;', + 'return a + b;', + 'return 0;', + 'return a * b;', + 'return a + b;', ], locationTexts: [ 'return sum;', @@ -68,6 +88,10 @@ void main() { 'return sum;', 'return result;', 'return x;', + 'return sum;', + 'return sum;', + 'return result;', + 'return result;', ], ); });