forked from dart-code-checker/dart-code-metrics
-
Notifications
You must be signed in to change notification settings - Fork 0
/
prefer_immediate_return_rule.dart
60 lines (51 loc) · 1.94 KB
/
prefer_immediate_return_rule.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// ignore_for_file: public_member_api_docs
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import '../../../../../utils/node_utils.dart';
import '../../../lint_utils.dart';
import '../../../models/internal_resolved_unit_result.dart';
import '../../../models/issue.dart';
import '../../../models/replacement.dart';
import '../../../models/severity.dart';
import '../../models/common_rule.dart';
import '../../rule_utils.dart';
part 'visitor.dart';
class PreferImmediateReturnRule extends CommonRule {
static const ruleId = 'prefer-immediate-return';
static const _warningMessage =
'Prefer returning the result immediately instead of declaring an intermediate variable right before the return statement.';
static const _replaceComment = 'Replace with immediate return.';
PreferImmediateReturnRule([Map<String, Object> config = const {}])
: super(
id: ruleId,
severity: readSeverity(config, Severity.style),
excludes: readExcludes(config),
);
@override
Iterable<Issue> check(InternalResolvedUnitResult source) {
final visitor = _Visitor();
source.unit.visitChildren(visitor);
return visitor.issues.map(
(issue) {
AstNode? getSingleDeclarationNode() {
final declarationList =
issue.variableDeclaration.parent as VariableDeclarationList;
return declarationList.variables.length == 1 ? declarationList : null;
}
return createIssue(
rule: this,
location: nodeLocation(
node: getSingleDeclarationNode() ?? issue.returnStatement,
endNode: issue.returnStatement,
source: source,
),
message: _warningMessage,
replacement: Replacement(
comment: _replaceComment,
replacement: 'return ${issue.variableDeclaration.initializer};',
),
);
},
).toList(growable: false);
}
}