Skip to content
This repository was archived by the owner on Jul 16, 2023. It is now read-only.

feat: show warning for rules without config that require config to work #1125

Merged
merged 2 commits into from
Dec 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Unreleased

* feat: show warning for rules without config that require config to work.
* fix: correctly handle FunctionExpressions for [`avoid-redundant-async`](https://dartcodemetrics.dev/docs/rules/common/avoid-redundant-async).
* feat: support ignoring nesting for [`prefer-conditional-expressions`](https://dartcodemetrics.dev/docs/rules/common/prefer-conditional-expressions).
* fix: ignore Providers for ['avoid-returning-widgets'](https://dartcodemetrics.dev/docs/rules/common/avoid-returning-widgets).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'lint_analysis_config.dart';
import 'models/issue.dart';
import 'models/lint_file_report.dart';
import 'models/severity.dart';
import 'rules/models/rule.dart';
import 'rules/rules_factory.dart';

class LintAnalysisOptionsValidator {
Expand All @@ -29,24 +30,12 @@ class LintAnalysisOptionsValidator {
return null;
}

final ids = allRuleIds.toSet();
final issues = <Issue>[];

for (final rule in rulesList) {
if (!ids.contains(rule.ruleName)) {
issues.add(
Issue(
ruleId: 'unknown-config',
severity: Severity.warning,
message:
"'${rule.ruleName}' is not recognized as a valid rule name.",
documentation: Uri.parse('https://dartcodemetrics.dev/docs/rules'),
location: _copySpanWithOffset(rule.span),
),
);
}
}
final parsedRulesById = config.codeRules.fold(
<String, Rule>{},
(rules, rule) => rules..putIfAbsent(rule.id, () => rule),
);

final issues = _validateForIssues(rulesList, parsedRulesById);
if (issues.isNotEmpty) {
final filePath = file.path;
final relativePath = relative(filePath, from: rootFolder);
Expand All @@ -72,12 +61,20 @@ class LintAnalysisOptionsValidator {
if (rule is YamlMap) {
final key = rule.nodes.keys.first as Object?;
if (key is YamlScalar && key.value is String) {
return _RuleWithSpan(key.value as String, key.span);
return _RuleWithSpan(
key.value as String,
key.span,
hasConfig: true,
);
}
}

if (rule is YamlScalar && rule.value is String) {
return _RuleWithSpan(rule.value as String, rule.span);
return _RuleWithSpan(
rule.value as String,
rule.span,
hasConfig: false,
);
}

return null;
Expand Down Expand Up @@ -105,11 +102,51 @@ class LintAnalysisOptionsValidator {
),
span.text,
);

static List<Issue> _validateForIssues(
List<_RuleWithSpan> rulesList,
Map<String, Rule> parsedRulesById,
) {
final ids = allRuleIds.toSet();
final issues = <Issue>[];

for (final rule in rulesList) {
if (!ids.contains(rule.ruleName)) {
issues.add(
Issue(
ruleId: 'unknown-config',
severity: Severity.warning,
message:
"'${rule.ruleName}' is not recognized as a valid rule name.",
documentation: Uri.parse('https://dartcodemetrics.dev/docs/rules'),
location: _copySpanWithOffset(rule.span),
),
);
}

final parsedRule = parsedRulesById[rule.ruleName];
if (parsedRule != null && parsedRule.requiresConfig && !rule.hasConfig) {
issues.add(
Issue(
ruleId: 'requires-config',
severity: Severity.warning,
message:
"'${rule.ruleName}' requires a config to produce any diagnostics.",
documentation: Uri.parse('https://dartcodemetrics.dev/docs/rules'),
location: _copySpanWithOffset(rule.span),
),
);
}
}

return issues;
}
}

class _RuleWithSpan {
final String ruleName;
final SourceSpan span;
final bool hasConfig;

const _RuleWithSpan(this.ruleName, this.span);
const _RuleWithSpan(this.ruleName, this.span, {required this.hasConfig});
}
2 changes: 2 additions & 0 deletions lib/src/analyzers/lint_analyzer/rules/models/rule.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ abstract class Rule {
required this.includes,
});

bool get requiresConfig => false;

/// Returns [Iterable] with [Issue]'s detected while check the passed [source]
Iterable<Issue> check(InternalResolvedUnitResult source);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ class AvoidBannedImportsRule extends CommonRule {
includes: readIncludes(config),
);

@override
bool get requiresConfig => true;

@override
Map<String, Object?> toJson() {
final json = super.toJson();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ class BanNameRule extends CommonRule {
includes: readIncludes(config),
);

@override
bool get requiresConfig => true;

@override
Map<String, Object?> toJson() {
final json = super.toJson();
Expand Down