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

Commit 54d50d5

Browse files
authored
fix: remove recursive traversal for ban-name (#1090)
1 parent 82fb849 commit 54d50d5

File tree

4 files changed

+69
-54
lines changed

4 files changed

+69
-54
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+
* fix: remove recursive traversal for [`ban-name`](https://dartcodemetrics.dev/docs/rules/common/ban-name) rule.
6+
37
## 5.1.0
48

59
* feat: add static code diagnostic [`arguments-ordering`](https://dartcodemetrics.dev/docs/rules/common/arguments-ordering).

lib/src/analyzers/lint_analyzer/rules/rules_list/ban_name/ban_name_rule.dart

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,33 @@ class BanNameRule extends CommonRule {
4242

4343
source.unit.visitChildren(visitor);
4444

45-
return visitor.nodes
46-
.map(
47-
(node) => createIssue(
48-
rule: this,
49-
location: nodeLocation(node: node.node, source: source),
50-
message: node.message,
51-
),
52-
)
53-
.toList(growable: false);
45+
final filteredNodeList = visitor.nodes.where((node) {
46+
if (node.endNode != null) {
47+
final inlineNode = source.content
48+
.substring(
49+
node.node.offset,
50+
node.endNode!.end,
51+
)
52+
.replaceAll('\n', '');
53+
54+
if (!inlineNode.contains(node.fullName)) {
55+
return false;
56+
}
57+
}
58+
59+
return true;
60+
});
61+
62+
return filteredNodeList.map(
63+
(node) => createIssue(
64+
rule: this,
65+
location: nodeLocation(
66+
node: node.node,
67+
source: source,
68+
endNode: node.endNode,
69+
),
70+
message: node.message,
71+
),
72+
);
5473
}
5574
}

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

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,96 +3,88 @@ part of 'ban_name_rule.dart';
33
class _Visitor extends GeneralizingAstVisitor<void> {
44
final Map<String, _BanNameConfigEntry> _entryMap;
55

6+
final _nodeBreadcrumb = <String, AstNode>{};
67
final _nodes = <_NodeInfo>[];
78

89
Iterable<_NodeInfo> get nodes => _nodes;
910

10-
final _visitedNodes = <AstNode>{};
11-
1211
_Visitor(List<_BanNameConfigEntry> entries)
1312
: _entryMap = Map.fromEntries(entries.map((e) => MapEntry(e.ident, e)));
1413

1514
@override
1615
void visitSimpleIdentifier(SimpleIdentifier node) {
17-
_visitIdent(node, node);
16+
_visitIdent(node, node.name);
1817
}
1918

2019
@override
2120
void visitPrefixedIdentifier(PrefixedIdentifier node) {
22-
_visitIdent(node, node.identifier);
23-
_visitIdent(node, node.prefix);
21+
_visitIdent(node, node.identifier.name);
22+
_visitIdent(node, node.prefix.name);
2423
}
2524

2625
@override
2726
void visitLibraryIdentifier(LibraryIdentifier node) {
2827
for (final component in node.components) {
29-
_visitIdent(node, component);
28+
_visitIdent(node, component.name);
3029
}
3130
}
3231

3332
@override
3433
void visitDeclaration(Declaration node) {
3534
final name = node.declaredElement?.displayName;
3635
if (name != null) {
37-
_checkBannedName(node, name);
36+
_visitIdent(node, name);
3837
}
3938

4039
super.visitDeclaration(node);
4140
}
4241

43-
void _visitIdent(AstNode node, SimpleIdentifier name) {
44-
_checkBannedName(name, name.name);
45-
46-
if (node is PrefixedIdentifier) {
47-
_checkBannedName(node, node.name);
42+
void _visitIdent(AstNode node, String name) {
43+
final prevNode =
44+
_nodeBreadcrumb.isNotEmpty ? _nodeBreadcrumb.values.last : null;
45+
if (node.offset - 1 == prevNode?.end) {
46+
_nodeBreadcrumb.addAll({name: node});
47+
} else {
48+
_nodeBreadcrumb.clear();
4849
}
4950

50-
_traverseParents(name.parent);
51-
}
52-
53-
void _traverseParents(AstNode? node) {
54-
if (node is MethodInvocation) {
55-
_checkBannedName(
56-
node,
57-
'${node.realTarget}.${node.methodName}',
58-
);
59-
_traverseParents(node.parent);
51+
if (_nodeBreadcrumb.isEmpty) {
52+
_nodeBreadcrumb.addAll({name: node});
6053
}
6154

62-
if (node is PropertyAccess) {
63-
_checkBannedName(
55+
if (_entryMap.containsKey(name)) {
56+
_nodes.add(_NodeInfo(
6457
node,
65-
'${node.realTarget}.${node.propertyName}',
66-
);
67-
_traverseParents(node.realTarget);
68-
}
58+
fullName: name,
59+
message: '${_entryMap[name]!.description} ($name is banned)',
60+
));
6961

70-
if (node is ConstructorName) {
71-
_traverseParents(node.parent);
62+
return;
7263
}
7364

74-
if (node is InstanceCreationExpression) {
75-
_checkBannedName(node, node.constructorName.toString());
76-
}
77-
}
78-
79-
void _checkBannedName(AstNode node, String name) {
80-
if (_entryMap.containsKey(name) && !_visitedNodes.contains(node)) {
81-
_visitedNodes.add(node);
65+
final breadcrumbString = _nodeBreadcrumb.keys.join('.');
66+
if (_entryMap.containsKey(breadcrumbString)) {
8267
_nodes.add(_NodeInfo(
83-
node,
84-
message: '${_entryMap[name]!.description} ($name is banned)',
68+
_nodeBreadcrumb.values.first,
69+
fullName: breadcrumbString,
70+
message:
71+
'${_entryMap[breadcrumbString]!.description} ($breadcrumbString is banned)',
72+
endNode: _nodeBreadcrumb.values.last,
8573
));
8674
}
8775
}
8876
}
8977

9078
class _NodeInfo {
9179
final AstNode node;
80+
final String fullName;
9281
final String message;
82+
final AstNode? endNode;
9383

9484
_NodeInfo(
9585
this.node, {
86+
required this.fullName,
9687
required this.message,
88+
this.endNode,
9789
});
9890
}

test/src/analyzers/lint_analyzer/rules/rules_list/ban_name/ban_name_rule_test.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ void main() {
5151
' late var strangeName; // LINT\n'
5252
'}',
5353
'strangeName',
54-
'StrangeClass.someMethod()',
55-
'DateTime.now()',
56-
'DateTime.now()',
57-
'DateTime.now()',
58-
'DateTime.now()',
54+
'StrangeClass.someMethod',
55+
'DateTime.now',
56+
'DateTime.now',
57+
'DateTime.now',
58+
'DateTime.now',
5959
],
6060
messages: [
6161
'Please use myShowDialog (showDialog is banned)',

0 commit comments

Comments
 (0)