@@ -3,96 +3,88 @@ part of 'ban_name_rule.dart';
33class _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
9078class _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}
0 commit comments