Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Issue #92: added naive implementation for dont_create_a_return_var_rule
  • Loading branch information
tozpeak committed Oct 1, 2025
commit 09536d5dcc8303dfdf4a98714d4a9c1b9767e2cd
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/syntactic_entity.dart';
import 'package:analyzer/error/listener.dart';
import 'package:collection/collection.dart';
import 'package:custom_lint_builder/custom_lint_builder.dart';
import 'package:solid_lints/src/models/rule_config.dart';
import 'package:solid_lints/src/models/solid_lint_rule.dart';
Expand Down Expand Up @@ -56,7 +59,52 @@ Rewrite the variable evaluation into return statement instead.""",
ErrorReporter reporter,
CustomLintContext context,
) {
// TODO: implement run
context.registry.addReturnStatement(
(statement) {
_checkReturnStatement(
statement: statement,
reporter: reporter,
context: context,
);
},
);
}

void _checkReturnStatement({
required ReturnStatement statement,
required ErrorReporter reporter,
required CustomLintContext context,
}) {
final expr = statement.expression;
if (expr is! SimpleIdentifier) return;
final returnVariableToken = expr.token;

//Looking for statement previous to return
final parent = statement.parent;
if (parent == null) return;

SyntacticEntity? previous;
for (final child in parent.childEntities) {
if (child == statement) break;
previous = child;
}
if (previous == null) return;

if (previous is! VariableDeclarationStatement) return;
final declarationStatement = previous;

//Checking if return variable was declared in previous statement
final VariableDeclaration? variableDeclaration =
declarationStatement.variables.variables
.firstWhereOrNull(
(v) => v.name.toString() == returnVariableToken.toString(),
);
if (variableDeclaration == null) return;

//Skipping mutable variables
if (!variableDeclaration.isFinal && !variableDeclaration.isConst) return;

reporter.atNode(expr, code);
}

}
Loading