Skip to content

Commit a0ca3c9

Browse files
committed
Make test pass
1 parent 2c453ee commit a0ca3c9

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

test/unit/vint/ast/plugin/test_autocmd_parser.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,132 +20,151 @@ def test_parse_autocmd(self):
2020
'pat': None,
2121
'nested': False,
2222
'cmd': None,
23+
'bang': False,
2324
}),
2425
(create_autocmd_node('autocmd!'), {
2526
'group': None,
2627
'event': [],
2728
'pat': None,
2829
'nested': False,
2930
'cmd': None,
31+
'bang': True,
3032
}),
3133
(create_autocmd_node('autocmd FileType'), {
3234
'group': None,
3335
'event': [AutocmdEvents.FILE_TYPE],
3436
'pat': None,
3537
'nested': False,
3638
'cmd': None,
39+
'bang': False,
3740
}),
3841
(create_autocmd_node('autocmd BufNew,BufRead'), {
3942
'group': None,
4043
'event': [AutocmdEvents.BUF_NEW, AutocmdEvents.BUF_READ],
4144
'pat': None,
4245
'nested': False,
4346
'cmd': None,
47+
'bang': False,
4448
}),
4549
(create_autocmd_node('autocmd! FileType'), {
4650
'group': None,
4751
'event': [AutocmdEvents.FILE_TYPE],
4852
'pat': None,
4953
'nested': False,
5054
'cmd': None,
55+
'bang': True,
5156
}),
5257
(create_autocmd_node('autocmd FileType *'), {
5358
'group': None,
5459
'event': [AutocmdEvents.FILE_TYPE],
5560
'pat': '*',
5661
'nested': False,
5762
'cmd': None,
63+
'bang': False,
5864
}),
5965
(create_autocmd_node('autocmd! FileType *'), {
6066
'group': None,
6167
'event': [AutocmdEvents.FILE_TYPE],
6268
'pat': '*',
6369
'nested': False,
6470
'cmd': None,
71+
'bang': True,
6572
}),
6673
(create_autocmd_node('autocmd FileType * nested :echo'), {
6774
'group': None,
6875
'event': [AutocmdEvents.FILE_TYPE],
6976
'pat': '*',
7077
'nested': True,
7178
'cmd': create_echo_cmd_node(),
79+
'bang': False,
7280
}),
7381
(create_autocmd_node('autocmd! FileType * nested :echo'), {
7482
'group': None,
7583
'event': [AutocmdEvents.FILE_TYPE],
7684
'pat': '*',
7785
'nested': True,
7886
'cmd': create_echo_cmd_node(),
87+
'bang': True,
7988
}),
8089
(create_autocmd_node('autocmd Group'), {
8190
'group': 'Group',
8291
'event': [],
8392
'pat': None,
8493
'nested': False,
8594
'cmd': None,
95+
'bang': False,
8696
}),
8797
(create_autocmd_node('autocmd! Group'), {
8898
'group': 'Group',
8999
'event': [],
90100
'pat': None,
91101
'nested': False,
92102
'cmd': None,
103+
'bang': True,
93104
}),
94105
(create_autocmd_node('autocmd Group *'), {
95106
'group': 'Group',
96107
'event': [AutocmdEvents.ANY],
97108
'pat': None,
98109
'nested': False,
99110
'cmd': None,
111+
'bang': False,
100112
}),
101113
(create_autocmd_node('autocmd! Group *'), {
102114
'group': 'Group',
103115
'event': [AutocmdEvents.ANY],
104116
'pat': None,
105117
'nested': False,
106118
'cmd': None,
119+
'bang': True,
107120
}),
108121
(create_autocmd_node('autocmd Group FileType'), {
109122
'group': 'Group',
110123
'event': [AutocmdEvents.FILE_TYPE],
111124
'pat': None,
112125
'nested': False,
113126
'cmd': None,
127+
'bang': False,
114128
}),
115129
(create_autocmd_node('autocmd! Group FileType'), {
116130
'group': 'Group',
117131
'event': [AutocmdEvents.FILE_TYPE],
118132
'pat': None,
119133
'nested': False,
120134
'cmd': None,
135+
'bang': True,
121136
}),
122137
(create_autocmd_node('autocmd Group FileType *'), {
123138
'group': 'Group',
124139
'event': [AutocmdEvents.FILE_TYPE],
125140
'pat': '*',
126141
'nested': False,
127142
'cmd': None,
143+
'bang': False,
128144
}),
129145
(create_autocmd_node('autocmd! Group FileType *'), {
130146
'group': 'Group',
131147
'event': [AutocmdEvents.FILE_TYPE],
132148
'pat': '*',
133149
'nested': False,
134150
'cmd': None,
151+
'bang': True,
135152
}),
136153
(create_autocmd_node('autocmd Group FileType * nested :echo'), {
137154
'group': 'Group',
138155
'event': [AutocmdEvents.FILE_TYPE],
139156
'pat': '*',
140157
'nested': True,
141158
'cmd': create_echo_cmd_node(),
159+
'bang': False,
142160
}),
143161
(create_autocmd_node('autocmd! Group FileType * nested :echo'), {
144162
'group': 'Group',
145163
'event': [AutocmdEvents.FILE_TYPE],
146164
'pat': '*',
147165
'nested': True,
148166
'cmd': create_echo_cmd_node(),
167+
'bang': True,
149168
}),
150169
]
151170

vint/ast/plugin/autocmd_parser.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,20 @@ def parse_autocmd(autocmd_node):
3636
'pat': None,
3737
'nested': False,
3838
'cmd': None,
39+
'bang': False
3940
}
4041

42+
# type: str
4143
autocmd_str = autocmd_node.get('str')
4244

4345
# This tokens may be broken, because the cmd part can have
4446
# whitespaces.
47+
# type: [str]
4548
tokens = autocmd_str.split(None, 2)
49+
50+
if len(tokens) > 0:
51+
autocmd_info['bang'] = tokens[0].endswith('!')
52+
4653
if len(tokens) == 1:
4754
# Examples:
4855
# :au[tocmd][!]
@@ -167,12 +174,3 @@ def _parse_events(token):
167174

168175
def is_autocmd_event_like(token):
169176
return all([is_autocmd_event(part) for part in token.split(',')])
170-
171-
172-
@register_traverser_extension
173-
def traverse_autocmd(node, on_enter=None, on_leave=None):
174-
autocmd_content = get_autocmd_content(node)
175-
if autocmd_content is None:
176-
return
177-
178-
traverse(autocmd_content, on_enter=on_enter, on_leave=on_leave)

vint/linting/linter.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from vint.ast.node_type import NodeType
88
from vint.ast.traversing import traverse
99
from vint.ast.plugin.scope_plugin import ScopePlugin
10+
from vint.ast.plugin.autocmd_parser import AutocmdParser
1011
from vint.linting.config.config_container import ConfigContainer
1112
from vint.linting.config.config_dict_source import ConfigDictSource
1213
from vint.linting.config.config_comment_source import ConfigCommentSource
@@ -32,6 +33,7 @@ class Linter(object):
3233
def __init__(self, policy_set, config_dict_global):
3334
self._plugins = {
3435
'scope': ScopePlugin(),
36+
'autocmd': AutocmdParser(),
3537
}
3638
self._policy_set = policy_set
3739

vint/linting/policy/prohibit_autocmd_with_no_group.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from vint.linting.policy.abstract_policy import AbstractPolicy
55
from vint.linting.policy_registry import register_policy
66
from vint.ast.dictionary.autocmd_events import AutocmdEvents
7+
from vint.ast.plugin.autocmd_parser import AUTOCMD_CONTENT
8+
from pprint import pprint
79

810

911
@register_policy
@@ -27,19 +29,21 @@ def is_valid(self, node, lint_context):
2729
autocmd family should be called with any groups.
2830
"""
2931

30-
# noed.ea.cmd is empty when line jump command such as 1
32+
# node.ea.cmd is empty when line jump command such as 1
3133
cmd_name = node['ea']['cmd'].get('name', None)
3234

3335
is_autocmd = cmd_name == 'autocmd'
3436
if is_autocmd and not self.is_inside_of_augroup:
35-
matched = re.match(r'au(?:tocmd)?!?\s+(\S+)', node['str'])
36-
37-
if not matched:
37+
autocmd_attr = node[AUTOCMD_CONTENT]
38+
if autocmd_attr['bang']:
3839
# Looks like autocmd with a bang
3940
return True
4041

41-
has_no_group = matched.group(1) in AutocmdEvents
42-
return not has_no_group
42+
has_group = autocmd_attr.get('group') is not None
43+
if has_group:
44+
return True
45+
46+
return self.is_inside_of_augroup
4347

4448
is_augroup = cmd_name == 'augroup'
4549
if is_augroup:

0 commit comments

Comments
 (0)