From 2e57770effaed0cc12326bd2cbaa8a4bb01c4945 Mon Sep 17 00:00:00 2001 From: Illia Aihistov Date: Wed, 17 Jun 2026 16:54:23 +0300 Subject: [PATCH 1/2] fix: update avoid_unnecessary_return_variable to correctly traverse FunctionBody (#236) --- ...d_unnecessary_return_variable_visitor.dart | 16 +++++--- ...unnecessary_return_variable_rule_test.dart | 40 +++++++++++++++++++ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/lib/src/lints/avoid_unnecessary_return_variable/visitors/avoid_unnecessary_return_variable_visitor.dart b/lib/src/lints/avoid_unnecessary_return_variable/visitors/avoid_unnecessary_return_variable_visitor.dart index ebfad8e4..9f5817a7 100644 --- a/lib/src/lints/avoid_unnecessary_return_variable/visitors/avoid_unnecessary_return_variable_visitor.dart +++ b/lib/src/lints/avoid_unnecessary_return_variable/visitors/avoid_unnecessary_return_variable_visitor.dart @@ -15,7 +15,7 @@ class AvoidUnnecessaryReturnVariableVisitor extends SimpleAstVisitor { @override void visitReturnStatement(ReturnStatement node) { - final expr = node.expression; + final expr = node.expression?.unParenthesized; if (expr is! SimpleIdentifier) return; final element = expr.element; @@ -23,8 +23,10 @@ class AvoidUnnecessaryReturnVariableVisitor extends SimpleAstVisitor { if (!element.isFinal && !element.isConst) return; - final block = node.parent; - if (block == null) return; + //get enclosing block function body + final functionBody = node.thisOrAncestorOfType(); + if (functionBody == null) return; + final block = functionBody.block; final returnVariableUsageVisitor = ReturnVariableUsageVisitor( node, @@ -34,16 +36,18 @@ class AvoidUnnecessaryReturnVariableVisitor extends SimpleAstVisitor { block.visitChildren(returnVariableUsageVisitor); if (!returnVariableUsageVisitor.hasBadStatementCount) return; + //check if declaration statement is found + final declaration = returnVariableUsageVisitor.variableDeclaration; + if (declaration == null) return; + //it is 100% bad if return statement follows declaration if (!returnVariableUsageVisitor.foundTokensBetweenDeclarationAndReturn) { _rule.reportAtNode(node); return; } - final declaration = returnVariableUsageVisitor.variableDeclaration; - //check if immutable - final initializer = declaration?.initializer; + final initializer = declaration.initializer; if (initializer == null) return; if (!_isExpressionImmutable(initializer)) return; diff --git a/test/lints/avoid_unnecessary_return_variable/avoid_unnecessary_return_variable_rule_test.dart b/test/lints/avoid_unnecessary_return_variable/avoid_unnecessary_return_variable_rule_test.dart index d2e42b16..4c74646c 100644 --- a/test/lints/avoid_unnecessary_return_variable/avoid_unnecessary_return_variable_rule_test.dart +++ b/test/lints/avoid_unnecessary_return_variable/avoid_unnecessary_return_variable_rule_test.dart @@ -172,4 +172,44 @@ void _doNothing() {} [lint(304, 14)], ); } + + void test_does_not_report_if_return_is_cached_nested_block() async { + await assertNoDiagnostics(r''' +Future testAvoidUnnecessaryReturnVariableNestedBlock() async { + final cached = 'cached'; + if (cached.isNotEmpty) { + // Should NOT trigger the avoid_unnecessary_return_variable lint + return cached; + } + return null; +} +'''); + } + + void test_reports_if_return_is_cached_and_only_returned_nested_block() async { + await assertDiagnostics( + r''' +int test(bool b) { + final a = 3; + if (b) { + return a; + } + return 0; +} +''', + [lint(49, 9)], + ); + } + + void test_reports_if_return_in_parentheses() async { + await assertDiagnostics( + r''' +int test() { + final a = 3; + return (a); +} +''', + [lint(30, 11)], + ); + } } From 5d1f3c7e41d6aa7e7caf19540e08fd9734039367 Mon Sep 17 00:00:00 2001 From: Illia Aihistov Date: Wed, 17 Jun 2026 17:09:18 +0300 Subject: [PATCH 2/2] refactor: simplify block retrieval in avoid_unnecessary_return_variable visitor --- .../visitors/avoid_unnecessary_return_variable_visitor.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/src/lints/avoid_unnecessary_return_variable/visitors/avoid_unnecessary_return_variable_visitor.dart b/lib/src/lints/avoid_unnecessary_return_variable/visitors/avoid_unnecessary_return_variable_visitor.dart index 9f5817a7..95233f43 100644 --- a/lib/src/lints/avoid_unnecessary_return_variable/visitors/avoid_unnecessary_return_variable_visitor.dart +++ b/lib/src/lints/avoid_unnecessary_return_variable/visitors/avoid_unnecessary_return_variable_visitor.dart @@ -24,9 +24,8 @@ class AvoidUnnecessaryReturnVariableVisitor extends SimpleAstVisitor { if (!element.isFinal && !element.isConst) return; //get enclosing block function body - final functionBody = node.thisOrAncestorOfType(); - if (functionBody == null) return; - final block = functionBody.block; + final block = node.thisOrAncestorOfType()?.block; + if (block == null) return; final returnVariableUsageVisitor = ReturnVariableUsageVisitor( node,