@@ -9,6 +9,7 @@ import 'lint_analysis_config.dart';
9
9
import 'models/issue.dart' ;
10
10
import 'models/lint_file_report.dart' ;
11
11
import 'models/severity.dart' ;
12
+ import 'rules/models/rule.dart' ;
12
13
import 'rules/rules_factory.dart' ;
13
14
14
15
class LintAnalysisOptionsValidator {
@@ -29,24 +30,12 @@ class LintAnalysisOptionsValidator {
29
30
return null ;
30
31
}
31
32
32
- final ids = allRuleIds.toSet ();
33
- final issues = < Issue > [];
34
-
35
- for (final rule in rulesList) {
36
- if (! ids.contains (rule.ruleName)) {
37
- issues.add (
38
- Issue (
39
- ruleId: 'unknown-config' ,
40
- severity: Severity .warning,
41
- message:
42
- "'${rule .ruleName }' is not recognized as a valid rule name." ,
43
- documentation: Uri .parse ('https://dartcodemetrics.dev/docs/rules' ),
44
- location: _copySpanWithOffset (rule.span),
45
- ),
46
- );
47
- }
48
- }
33
+ final parsedRulesById = config.codeRules.fold (
34
+ < String , Rule > {},
35
+ (rules, rule) => rules..putIfAbsent (rule.id, () => rule),
36
+ );
49
37
38
+ final issues = _validateForIssues (rulesList, parsedRulesById);
50
39
if (issues.isNotEmpty) {
51
40
final filePath = file.path;
52
41
final relativePath = relative (filePath, from: rootFolder);
@@ -72,12 +61,20 @@ class LintAnalysisOptionsValidator {
72
61
if (rule is YamlMap ) {
73
62
final key = rule.nodes.keys.first as Object ? ;
74
63
if (key is YamlScalar && key.value is String ) {
75
- return _RuleWithSpan (key.value as String , key.span);
64
+ return _RuleWithSpan (
65
+ key.value as String ,
66
+ key.span,
67
+ hasConfig: true ,
68
+ );
76
69
}
77
70
}
78
71
79
72
if (rule is YamlScalar && rule.value is String ) {
80
- return _RuleWithSpan (rule.value as String , rule.span);
73
+ return _RuleWithSpan (
74
+ rule.value as String ,
75
+ rule.span,
76
+ hasConfig: false ,
77
+ );
81
78
}
82
79
83
80
return null ;
@@ -105,11 +102,51 @@ class LintAnalysisOptionsValidator {
105
102
),
106
103
span.text,
107
104
);
105
+
106
+ static List <Issue > _validateForIssues (
107
+ List <_RuleWithSpan > rulesList,
108
+ Map <String , Rule > parsedRulesById,
109
+ ) {
110
+ final ids = allRuleIds.toSet ();
111
+ final issues = < Issue > [];
112
+
113
+ for (final rule in rulesList) {
114
+ if (! ids.contains (rule.ruleName)) {
115
+ issues.add (
116
+ Issue (
117
+ ruleId: 'unknown-config' ,
118
+ severity: Severity .warning,
119
+ message:
120
+ "'${rule .ruleName }' is not recognized as a valid rule name." ,
121
+ documentation: Uri .parse ('https://dartcodemetrics.dev/docs/rules' ),
122
+ location: _copySpanWithOffset (rule.span),
123
+ ),
124
+ );
125
+ }
126
+
127
+ final parsedRule = parsedRulesById[rule.ruleName];
128
+ if (parsedRule != null && parsedRule.requiresConfig && ! rule.hasConfig) {
129
+ issues.add (
130
+ Issue (
131
+ ruleId: 'requires-config' ,
132
+ severity: Severity .warning,
133
+ message:
134
+ "'${rule .ruleName }' requires a config to produce any diagnostics." ,
135
+ documentation: Uri .parse ('https://dartcodemetrics.dev/docs/rules' ),
136
+ location: _copySpanWithOffset (rule.span),
137
+ ),
138
+ );
139
+ }
140
+ }
141
+
142
+ return issues;
143
+ }
108
144
}
109
145
110
146
class _RuleWithSpan {
111
147
final String ruleName;
112
148
final SourceSpan span;
149
+ final bool hasConfig;
113
150
114
- const _RuleWithSpan (this .ruleName, this .span);
151
+ const _RuleWithSpan (this .ruleName, this .span, { required this .hasConfig} );
115
152
}
0 commit comments