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

fix: correctly handle implicit type parameters for no-equal-arguments #1190

Merged
merged 4 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: correctly handle implicit type parameters for [`no-equal-arguments`](https://dcm.dev/docs/individuals/rules/common/no-equal-arguments).
* fix: correctly handle `dynamic` type for [`avoid-passing-async-when-sync-expected`](https://dcm.dev/docs/individuals/rules/common/avoid-passing-async-when-sync-expected).
* fix: check `didChangeDependencies` for [`avoid-unnecessary-setstate`](https://dcm.dev/docs/individuals/rules/flutter/avoid-unnecessary-setstate).
* fix: add new config option for [`no-equal-arguments`](https://dcm.dev/docs/individuals/rules/common/no-equal-arguments).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,16 @@ class _Visitor extends RecursiveAstVisitor<void> {
arg is NamedExpression &&
argument.expression is! Literal &&
arg.expression is! Literal) {
return argument.expression.toString() == arg.expression.toString();
return haveSameParameterType(argument.expression, arg.expression) &&
argument.expression.toString() == arg.expression.toString();
}

if (_bothLiterals(argument, arg)) {
return argument == arg;
}

return argument.toString() == arg.toString();
return haveSameParameterType(argument, arg) &&
argument.toString() == arg.toString();
});

if (argument != lastAppearance) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,5 @@ class _BlockVisitor extends RecursiveAstVisitor<void> {
bool _haveDifferentParameterTypes(AstNode visitedInvocation, AstNode node) =>
visitedInvocation is Expression &&
node is Expression &&
visitedInvocation.staticParameterElement?.type !=
node.staticParameterElement?.type;
!haveSameParameterType(visitedInvocation, node);
}
3 changes: 3 additions & 0 deletions lib/src/utils/node_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ bool isOverride(List<Annotation> metadata) => metadata.any(
node.name.name == 'override' && node.atSign.type == TokenType.AT,
);

bool haveSameParameterType(Expression left, Expression right) =>
left.staticParameterElement?.type == right.staticParameterElement?.type;

bool isEntrypoint(String name, NodeList<Annotation> metadata) =>
name == 'main' ||
_hasPragmaAnnotation(metadata) ||
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
class MyApp extends StatefulWidget {
const MyApp();
}

class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();

final model = MyModel(
context.read(),
context.read(),
context.read(),
);
}

@override
Widget build(BuildContext context) {
return Container();
}
}

class A {}

class B {}

class C {}

class MyModel {
final A a;
final B b;
final C c;

const MyModel(this.a, this.b, this.c);
}

class Widget {}

class StatefulWidget extends Widget {}

class BuildContext {}

extension ReadContext on BuildContext {
T read<T>() {
return 'value' as T;
}
}

abstract class State<T> {
void initState();

void setState(VoidCallback callback) => callback();

BuildContext get context => BuildContext();
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ const _incorrectExamplePath =
'no_equal_arguments/examples/incorrect_example.dart';
const _namedParametersExamplePath =
'no_equal_arguments/examples/named_parameters_example.dart';
const _providerExamplePath =
'no_equal_arguments/examples/provider_example.dart';

void main() {
group('NoEqualArgumentsRule', () {
Expand Down Expand Up @@ -58,34 +60,41 @@ void main() {

RuleTestHelper.verifyNoIssues(issues);
});
});

test('reports about found issue with default config', () async {
final unit =
await RuleTestHelper.resolveFromFile(_namedParametersExamplePath);
final issues = NoEqualArgumentsRule().check(unit);
test('reports about found issue with default config', () async {
final unit =
await RuleTestHelper.resolveFromFile(_namedParametersExamplePath);
final issues = NoEqualArgumentsRule().check(unit);

RuleTestHelper.verifyIssues(
issues: issues,
startLines: [9],
startColumns: [3],
locationTexts: ['lastName: firstName'],
messages: ['The argument has already been passed.'],
);
});
RuleTestHelper.verifyIssues(
issues: issues,
startLines: [9],
startColumns: [3],
locationTexts: ['lastName: firstName'],
messages: ['The argument has already been passed.'],
);
});

test('reports no issues with custom config', () async {
final unit =
await RuleTestHelper.resolveFromFile(_namedParametersExamplePath);
final config = {
'ignored-parameters': [
'lastName',
],
};
test('reports no issues for provider read', () async {
final unit = await RuleTestHelper.resolveFromFile(_providerExamplePath);
final issues = NoEqualArgumentsRule().check(unit);

final issues = NoEqualArgumentsRule(config).check(unit);
RuleTestHelper.verifyNoIssues(issues);
});

RuleTestHelper.verifyNoIssues(issues);
test('reports no issues with custom config', () async {
final unit =
await RuleTestHelper.resolveFromFile(_namedParametersExamplePath);
final config = {
'ignored-parameters': [
'lastName',
],
};

final issues = NoEqualArgumentsRule(config).check(unit);

RuleTestHelper.verifyNoIssues(issues);
});
});

test('reports about found issue with ignored arguments config', () async {
Expand Down