Skip to content

Commit 09536d5

Browse files
committed
Issue #92: added naive implementation for dont_create_a_return_var_rule
1 parent 5f4a8f9 commit 09536d5

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

lib/src/lints/dont_create_a_return_var/dont_create_a_return_var_rule.dart

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import 'package:analyzer/dart/ast/ast.dart';
2+
import 'package:analyzer/dart/ast/syntactic_entity.dart';
13
import 'package:analyzer/error/listener.dart';
4+
import 'package:collection/collection.dart';
25
import 'package:custom_lint_builder/custom_lint_builder.dart';
36
import 'package:solid_lints/src/models/rule_config.dart';
47
import 'package:solid_lints/src/models/solid_lint_rule.dart';
@@ -56,7 +59,52 @@ Rewrite the variable evaluation into return statement instead.""",
5659
ErrorReporter reporter,
5760
CustomLintContext context,
5861
) {
59-
// TODO: implement run
62+
context.registry.addReturnStatement(
63+
(statement) {
64+
_checkReturnStatement(
65+
statement: statement,
66+
reporter: reporter,
67+
context: context,
68+
);
69+
},
70+
);
71+
}
72+
73+
void _checkReturnStatement({
74+
required ReturnStatement statement,
75+
required ErrorReporter reporter,
76+
required CustomLintContext context,
77+
}) {
78+
final expr = statement.expression;
79+
if (expr is! SimpleIdentifier) return;
80+
final returnVariableToken = expr.token;
81+
82+
//Looking for statement previous to return
83+
final parent = statement.parent;
84+
if (parent == null) return;
85+
86+
SyntacticEntity? previous;
87+
for (final child in parent.childEntities) {
88+
if (child == statement) break;
89+
previous = child;
90+
}
91+
if (previous == null) return;
92+
93+
if (previous is! VariableDeclarationStatement) return;
94+
final declarationStatement = previous;
95+
96+
//Checking if return variable was declared in previous statement
97+
final VariableDeclaration? variableDeclaration =
98+
declarationStatement.variables.variables
99+
.firstWhereOrNull(
100+
(v) => v.name.toString() == returnVariableToken.toString(),
101+
);
102+
if (variableDeclaration == null) return;
103+
104+
//Skipping mutable variables
105+
if (!variableDeclaration.isFinal && !variableDeclaration.isConst) return;
106+
107+
reporter.atNode(expr, code);
60108
}
61109

62110
}

0 commit comments

Comments
 (0)