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

Commit 6a8b063

Browse files
committed
feat: ignore tear-off methods for avoid-unused-parameters
1 parent cc1bb04 commit 6a8b063

File tree

7 files changed

+87
-12
lines changed

7 files changed

+87
-12
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
* feat: ignore tear-off methods for [`avoid-unused-parameters`](https://dartcodemetrics.dev/docs/rules/common/avoid-unused-parameters).
6+
37
## 5.3.0
48

59
* feat: add static code diagnostic [`list-all-equatable-fields`](https://dartcodemetrics.dev/docs/rules/common/list-all-equatable-fields).

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,7 @@ class _Visitor extends RecursiveAstVisitor<void> {
99
void visitMethodDeclaration(MethodDeclaration node) {
1010
super.visitMethodDeclaration(node);
1111

12-
final isOverride = node.metadata.any(
13-
(node) =>
14-
node.name.name == 'override' && node.atSign.type == TokenType.AT,
15-
);
16-
17-
if (!isOverride && _hasRedundantAsync(node.body)) {
12+
if (!isOverride(node.metadata) && _hasRedundantAsync(node.body)) {
1813
_declarations.add(node);
1914
}
2015
}

lib/src/analyzers/lint_analyzer/rules/rules_list/avoid_unused_parameters/avoid_unused_parameters_rule.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// ignore_for_file: public_member_api_docs
22

33
import 'package:analyzer/dart/ast/ast.dart';
4-
import 'package:analyzer/dart/ast/token.dart';
54
import 'package:analyzer/dart/ast/visitor.dart';
65
import 'package:analyzer/dart/element/element.dart';
76

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

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,9 @@ class _Visitor extends RecursiveAstVisitor<void> {
1919
return;
2020
}
2121

22-
final isOverride = node.metadata.any(
23-
(node) =>
24-
node.name.name == 'override' && node.atSign.type == TokenType.AT,
25-
);
22+
final isTearOff = _usedAsTearOff(node);
2623

27-
if (!isOverride) {
24+
if (!isOverride(node.metadata) && !isTearOff) {
2825
_unusedParameters.addAll(
2926
_getUnusedParameters(
3027
node.body,
@@ -77,6 +74,18 @@ class _Visitor extends RecursiveAstVisitor<void> {
7774
bool _hasNoUnderscoresInName(FormalParameter parameter) =>
7875
parameter.name != null &&
7976
parameter.name!.lexeme.replaceAll('_', '').isNotEmpty;
77+
78+
bool _usedAsTearOff(MethodDeclaration node) {
79+
final name = node.name.lexeme;
80+
if (!Identifier.isPrivateName(name)) {
81+
return false;
82+
}
83+
84+
final visitor = _InvocationsVisitor(name);
85+
node.root.visitChildren(visitor);
86+
87+
return visitor.hasTearOffInvocations;
88+
}
8089
}
8190

8291
class _IdentifiersVisitor extends RecursiveAstVisitor<void> {
@@ -92,3 +101,22 @@ class _IdentifiersVisitor extends RecursiveAstVisitor<void> {
92101
}
93102
}
94103
}
104+
105+
class _InvocationsVisitor extends RecursiveAstVisitor<void> {
106+
final String methodName;
107+
108+
bool hasTearOffInvocations = false;
109+
110+
_InvocationsVisitor(this.methodName);
111+
112+
@override
113+
void visitSimpleIdentifier(SimpleIdentifier node) {
114+
if (node.name == methodName &&
115+
node.staticElement is MethodElement &&
116+
node.parent! is MethodInvocation) {
117+
hasTearOffInvocations = true;
118+
}
119+
120+
super.visitSimpleIdentifier(node);
121+
}
122+
}

lib/src/utils/node_utils.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:analyzer/dart/ast/ast.dart';
22
import 'package:analyzer/dart/ast/syntactic_entity.dart';
3+
import 'package:analyzer/dart/ast/token.dart';
34
import 'package:source_span/source_span.dart';
45

56
import '../analyzers/lint_analyzer/models/internal_resolved_unit_result.dart';
@@ -37,6 +38,11 @@ SourceSpan nodeLocation({
3738
);
3839
}
3940

41+
bool isOverride(List<Annotation> metadata) => metadata.any(
42+
(node) =>
43+
node.name.name == 'override' && node.atSign.type == TokenType.AT,
44+
);
45+
4046
bool isEntrypoint(String name, NodeList<Annotation> metadata) =>
4147
name == 'main' ||
4248
_hasPragmaAnnotation(metadata) ||

test/src/analyzers/lint_analyzer/rules/rules_list/avoid_unused_parameters/avoid_unused_parameters_rule_test.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ const _correctExamplePath =
88
'avoid_unused_parameters/examples/correct_example.dart';
99
const _incorrectExamplePath =
1010
'avoid_unused_parameters/examples/incorrect_example.dart';
11+
const _tearOffExamplePath =
12+
'avoid_unused_parameters/examples/tear_off_example.dart';
1113

1214
void main() {
1315
group('AvoidUnusedParametersRule', () {
@@ -61,5 +63,26 @@ void main() {
6163
],
6264
);
6365
});
66+
67+
test('should report about found issues for tear-offs', () async {
68+
final unit = await RuleTestHelper.resolveFromFile(_tearOffExamplePath);
69+
final issues = AvoidUnusedParametersRule().check(unit);
70+
71+
RuleTestHelper.verifyIssues(
72+
issues: issues,
73+
startLines: [8, 13, 13],
74+
startColumns: [36, 23, 43],
75+
locationTexts: [
76+
'int value',
77+
'String firstString',
78+
'String secondString',
79+
],
80+
messages: [
81+
'Parameter is unused.',
82+
'Parameter is unused.',
83+
'Parameter is unused.',
84+
],
85+
);
86+
});
6487
});
6588
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class TestClass {
2+
String value;
3+
4+
void _someMethod(Function(String, int) callback) {
5+
callback();
6+
}
7+
8+
void _otherMethod(String string, int value) {
9+
print(string);
10+
}
11+
12+
// LINT
13+
void _anotherMethod(String firstString, String secondString) {
14+
someMethod(_otherMethod);
15+
_someOtherMethod(value);
16+
}
17+
18+
// LINT
19+
_someOtherMethod(String value) {}
20+
}

0 commit comments

Comments
 (0)