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

feat: add new config option #1187

Merged
merged 2 commits into from
Feb 12, 2023
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

* fix: add new config option for [`no-equal-arguments`](https://dcm.dev/docs/individuals/rules/common/no-equal-arguments).
* feat: add `allow-nullable` config option for [`avoid-returning-widgets`](https://dcm.dev/docs/individuals/rules/common/avoid-returning-widgets).
* fix: support `assert(mounted)` for [`use-setstate-synchronously`](https://dcm.dev/docs/individuals/rules/flutter/use-setstate-synchronously).
* fix: correctly support dartdoc tags for [`format-comment`](https://dcm.dev/docs/individuals/rules/common/format-comment).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@ part of 'no_equal_arguments_rule.dart';

class _ConfigParser {
static const _ignoredParametersConfig = 'ignored-parameters';
static const _ignoredArgumentsConfig = 'ignored-arguments';

static Iterable<String> parseIgnoredArguments(Map<String, Object> config) =>
config.containsKey(_ignoredArgumentsConfig) &&
config[_ignoredArgumentsConfig] is Iterable
? List<String>.from(config[_ignoredArgumentsConfig] as Iterable)
: <String>[];

static Iterable<String> parseIgnoredParameters(Map<String, Object> config) =>
config.containsKey(_ignoredParametersConfig) &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:collection/collection.dart';

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

final Iterable<String> _ignoredParameters;
final Iterable<String> _ignoredArguments;

NoEqualArgumentsRule([Map<String, Object> config = const {}])
: _ignoredParameters = _ConfigParser.parseIgnoredParameters(config),
_ignoredArguments = _ConfigParser.parseIgnoredArguments(config),
super(
id: ruleId,
severity: readSeverity(config, Severity.warning),
Expand All @@ -34,13 +37,14 @@ class NoEqualArgumentsRule extends CommonRule {
Map<String, Object?> toJson() {
final json = super.toJson();
json[_ConfigParser._ignoredParametersConfig] = _ignoredParameters.toList();
json[_ConfigParser._ignoredArgumentsConfig] = _ignoredArguments.toList();

return json;
}

@override
Iterable<Issue> check(InternalResolvedUnitResult source) {
final visitor = _Visitor(_ignoredParameters);
final visitor = _Visitor(_ignoredParameters, _ignoredArguments);

source.unit.visitChildren(visitor);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ class _Visitor extends RecursiveAstVisitor<void> {
final _arguments = <Expression>[];

final Iterable<String> _ignoredParameters;
final Iterable<String> _ignoredArguments;

Iterable<Expression> get arguments => _arguments;

_Visitor(this._ignoredParameters);
_Visitor(this._ignoredParameters, this._ignoredArguments);

@override
void visitMethodInvocation(MethodInvocation node) {
Expand All @@ -31,7 +32,7 @@ class _Visitor extends RecursiveAstVisitor<void> {
}

void _visitArguments(Iterable<Expression> arguments) {
final notIgnoredArguments = arguments.where(_isNotIgnored).toList();
final notIgnoredArguments = arguments.whereNot(_isIgnored).toList();

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

bool _isNotIgnored(Expression arg) => !(arg is NamedExpression &&
_ignoredParameters.contains(arg.name.label.name));
bool _isIgnored(Expression arg) {
if (arg is NamedExpression) {
final expression = arg.expression;

return _ignoredParameters.contains(arg.name.label.name) ||
(expression is SimpleIdentifier &&
_ignoredArguments.contains(expression.name));
}

return arg is SimpleIdentifier && _ignoredArguments.contains(arg.name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,33 @@ void main() {

RuleTestHelper.verifyNoIssues(issues);
});

test('reports about found issue with ignored arguments config', () async {
final unit = await RuleTestHelper.resolveFromFile(_incorrectExamplePath);
final issues = NoEqualArgumentsRule({
'ignored-arguments': ['firstName'],
}).check(unit);

RuleTestHelper.verifyIssues(
issues: issues,
startLines: [32, 37, 42, 47, 54, 59],
startColumns: [5, 5, 5, 5, 5, 5],
locationTexts: [
'user.firstName',
'user.getName',
'user.getFirstName()',
"user.getNewName('name')",
'user.getNewName(name)',
'lastName: user.firstName',
],
messages: [
'The argument has already been passed.',
'The argument has already been passed.',
'The argument has already been passed.',
'The argument has already been passed.',
'The argument has already been passed.',
'The argument has already been passed.',
],
);
});
}