|
| 1 | +import 'package:analyzer/dart/ast/ast.dart'; |
| 2 | +import 'package:analyzer/dart/ast/syntactic_entity.dart'; |
1 | 3 | import 'package:analyzer/error/listener.dart'; |
| 4 | +import 'package:collection/collection.dart'; |
2 | 5 | import 'package:custom_lint_builder/custom_lint_builder.dart'; |
3 | 6 | import 'package:solid_lints/src/models/rule_config.dart'; |
4 | 7 | import 'package:solid_lints/src/models/solid_lint_rule.dart'; |
@@ -56,7 +59,52 @@ Rewrite the variable evaluation into return statement instead.""", |
56 | 59 | ErrorReporter reporter, |
57 | 60 | CustomLintContext context, |
58 | 61 | ) { |
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); |
60 | 108 | } |
61 | 109 |
|
62 | 110 | } |
0 commit comments