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

Commit 8430b4a

Browse files
authored
feat: add new config option (#1187)
1 parent af1cc2e commit 8430b4a

File tree

5 files changed

+56
-5
lines changed

5 files changed

+56
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
* fix: add new config option for [`no-equal-arguments`](https://dcm.dev/docs/individuals/rules/common/no-equal-arguments).
56
* feat: add `allow-nullable` config option for [`avoid-returning-widgets`](https://dcm.dev/docs/individuals/rules/common/avoid-returning-widgets).
67
* fix: support `assert(mounted)` for [`use-setstate-synchronously`](https://dcm.dev/docs/individuals/rules/flutter/use-setstate-synchronously).
78
* fix: correctly support dartdoc tags for [`format-comment`](https://dcm.dev/docs/individuals/rules/common/format-comment).

lib/src/analyzers/lint_analyzer/rules/rules_list/no_equal_arguments/config_parser.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@ part of 'no_equal_arguments_rule.dart';
22

33
class _ConfigParser {
44
static const _ignoredParametersConfig = 'ignored-parameters';
5+
static const _ignoredArgumentsConfig = 'ignored-arguments';
6+
7+
static Iterable<String> parseIgnoredArguments(Map<String, Object> config) =>
8+
config.containsKey(_ignoredArgumentsConfig) &&
9+
config[_ignoredArgumentsConfig] is Iterable
10+
? List<String>.from(config[_ignoredArgumentsConfig] as Iterable)
11+
: <String>[];
512

613
static Iterable<String> parseIgnoredParameters(Map<String, Object> config) =>
714
config.containsKey(_ignoredParametersConfig) &&

lib/src/analyzers/lint_analyzer/rules/rules_list/no_equal_arguments/no_equal_arguments_rule.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import 'package:analyzer/dart/ast/ast.dart';
44
import 'package:analyzer/dart/ast/visitor.dart';
5+
import 'package:collection/collection.dart';
56

67
import '../../../../../utils/node_utils.dart';
78
import '../../../lint_utils.dart';
@@ -20,9 +21,11 @@ class NoEqualArgumentsRule extends CommonRule {
2021
static const _warningMessage = 'The argument has already been passed.';
2122

2223
final Iterable<String> _ignoredParameters;
24+
final Iterable<String> _ignoredArguments;
2325

2426
NoEqualArgumentsRule([Map<String, Object> config = const {}])
2527
: _ignoredParameters = _ConfigParser.parseIgnoredParameters(config),
28+
_ignoredArguments = _ConfigParser.parseIgnoredArguments(config),
2629
super(
2730
id: ruleId,
2831
severity: readSeverity(config, Severity.warning),
@@ -34,13 +37,14 @@ class NoEqualArgumentsRule extends CommonRule {
3437
Map<String, Object?> toJson() {
3538
final json = super.toJson();
3639
json[_ConfigParser._ignoredParametersConfig] = _ignoredParameters.toList();
40+
json[_ConfigParser._ignoredArgumentsConfig] = _ignoredArguments.toList();
3741

3842
return json;
3943
}
4044

4145
@override
4246
Iterable<Issue> check(InternalResolvedUnitResult source) {
43-
final visitor = _Visitor(_ignoredParameters);
47+
final visitor = _Visitor(_ignoredParameters, _ignoredArguments);
4448

4549
source.unit.visitChildren(visitor);
4650

lib/src/analyzers/lint_analyzer/rules/rules_list/no_equal_arguments/visitor.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ class _Visitor extends RecursiveAstVisitor<void> {
44
final _arguments = <Expression>[];
55

66
final Iterable<String> _ignoredParameters;
7+
final Iterable<String> _ignoredArguments;
78

89
Iterable<Expression> get arguments => _arguments;
910

10-
_Visitor(this._ignoredParameters);
11+
_Visitor(this._ignoredParameters, this._ignoredArguments);
1112

1213
@override
1314
void visitMethodInvocation(MethodInvocation node) {
@@ -31,7 +32,7 @@ class _Visitor extends RecursiveAstVisitor<void> {
3132
}
3233

3334
void _visitArguments(Iterable<Expression> arguments) {
34-
final notIgnoredArguments = arguments.where(_isNotIgnored).toList();
35+
final notIgnoredArguments = arguments.whereNot(_isIgnored).toList();
3536

3637
for (final argument in notIgnoredArguments) {
3738
final lastAppearance = notIgnoredArguments.lastWhere((arg) {
@@ -62,6 +63,15 @@ class _Visitor extends RecursiveAstVisitor<void> {
6263
right is PrefixExpression &&
6364
right.operand is Literal);
6465

65-
bool _isNotIgnored(Expression arg) => !(arg is NamedExpression &&
66-
_ignoredParameters.contains(arg.name.label.name));
66+
bool _isIgnored(Expression arg) {
67+
if (arg is NamedExpression) {
68+
final expression = arg.expression;
69+
70+
return _ignoredParameters.contains(arg.name.label.name) ||
71+
(expression is SimpleIdentifier &&
72+
_ignoredArguments.contains(expression.name));
73+
}
74+
75+
return arg is SimpleIdentifier && _ignoredArguments.contains(arg.name);
76+
}
6777
}

test/src/analyzers/lint_analyzer/rules/rules_list/no_equal_arguments/no_equal_arguments_rule_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,33 @@ void main() {
8787

8888
RuleTestHelper.verifyNoIssues(issues);
8989
});
90+
91+
test('reports about found issue with ignored arguments config', () async {
92+
final unit = await RuleTestHelper.resolveFromFile(_incorrectExamplePath);
93+
final issues = NoEqualArgumentsRule({
94+
'ignored-arguments': ['firstName'],
95+
}).check(unit);
96+
97+
RuleTestHelper.verifyIssues(
98+
issues: issues,
99+
startLines: [32, 37, 42, 47, 54, 59],
100+
startColumns: [5, 5, 5, 5, 5, 5],
101+
locationTexts: [
102+
'user.firstName',
103+
'user.getName',
104+
'user.getFirstName()',
105+
"user.getNewName('name')",
106+
'user.getNewName(name)',
107+
'lastName: user.firstName',
108+
],
109+
messages: [
110+
'The argument has already been passed.',
111+
'The argument has already been passed.',
112+
'The argument has already been passed.',
113+
'The argument has already been passed.',
114+
'The argument has already been passed.',
115+
'The argument has already been passed.',
116+
],
117+
);
118+
});
90119
}

0 commit comments

Comments
 (0)