All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
3 Save g:ale_linters_ignore
8 let g:lspconfig_names = {}
9 let g:ale_disable_lsp = 0
12 let g:run_linters_called = 0
14 runtime autoload/ale/engine.vim
15 runtime autoload/ale/engine/ignore.vim
17 " Mock the engine function so we can set it up.
18 function! ale#engine#RunLinters(buffer, linters, should_lint_file) abort
19 let g:linters = a:linters
20 let g:run_linters_called = 1
23 function! ale#engine#HandleLoclist(linter_name, buffer, loclist, from_other_source) abort
24 let g:loclist = a:loclist
27 function! ale#engine#ignore#GetLSPConfigNames() abort
28 return g:lspconfig_names
31 call ale#linter#Define('foobar', {
32 \ 'name': 'testlinter',
33 \ 'callback': 'TestCallback',
34 \ 'executable': has('win32') ? 'cmd' : 'true',
35 \ 'command': has('win32') ? 'echo' : 'true',
37 call ale#test#SetDirectory('/testplugin/test')
41 unlet! b:ale_linters_ignore
43 unlet! b:ale_save_event_fired
44 unlet! b:ale_disable_lsp
48 unlet! g:lspconfig_names
52 call ale#test#RestoreDirectory()
53 call ale#linter#Reset()
54 call ale#lsp_linter#ClearLSPData()
56 runtime autoload/ale/engine.vim
57 runtime autoload/ale/engine/ignore.vim
59 Execute(GetList should ignore some invalid values):
60 AssertEqual [], ale#engine#ignore#GetList('', 'foo')
61 AssertEqual [], ale#engine#ignore#GetList('', 0)
62 AssertEqual [], ale#engine#ignore#GetList('', v:null)
64 Execute(GetList should handle Lists):
65 AssertEqual ['foo', 'bar'], ale#engine#ignore#GetList('', ['foo', 'bar'])
67 Execute(GetList should handle Dictionaries):
69 \ ['linter1', 'linter2'],
70 \ uniq(sort(ale#engine#ignore#GetList('x.y.z', {
76 Execute(Exclude should ignore some invalid values):
79 \ {'name': 'linter1', 'aliases': []},
80 \ {'name': 'linter2', 'aliases': ['alias1']},
81 \ {'name': 'linter3', 'aliases': []},
83 \ ale#engine#ignore#Exclude(
86 \ {'name': 'linter1', 'aliases': []},
87 \ {'name': 'linter2', 'aliases': ['alias1']},
88 \ {'name': 'linter3', 'aliases': []},
95 \ {'name': 'linter1', 'aliases': []},
96 \ {'name': 'linter2', 'aliases': ['alias1']},
97 \ {'name': 'linter3', 'aliases': []},
99 \ ale#engine#ignore#Exclude(
102 \ {'name': 'linter1', 'aliases': []},
103 \ {'name': 'linter2', 'aliases': ['alias1']},
104 \ {'name': 'linter3', 'aliases': []},
111 \ {'name': 'linter1', 'aliases': []},
112 \ {'name': 'linter2', 'aliases': ['alias1']},
113 \ {'name': 'linter3', 'aliases': []},
115 \ ale#engine#ignore#Exclude(
118 \ {'name': 'linter1', 'aliases': []},
119 \ {'name': 'linter2', 'aliases': ['alias1']},
120 \ {'name': 'linter3', 'aliases': []},
126 Execute(Exclude should handle Lists):
129 \ {'name': 'linter3', 'aliases': []},
131 \ ale#engine#ignore#Exclude(
134 \ {'name': 'linter1', 'aliases': []},
135 \ {'name': 'linter2', 'aliases': ['alias1']},
136 \ {'name': 'linter3', 'aliases': []},
138 \ ['linter1', 'alias1'],
142 Execute(Exclude should handle Dictionaries):
145 \ {'name': 'linter3', 'aliases': []},
147 \ ale#engine#ignore#Exclude(
150 \ {'name': 'linter1', 'aliases': []},
151 \ {'name': 'linter2', 'aliases': ['alias1']},
152 \ {'name': 'linter3', 'aliases': []},
154 \ {'foo': ['linter1'], 'bar': ['alias1']},
158 Execute(Exclude should filter LSP linters when ale_disable_lsp is set to 1):
161 \ {'name': 'linter1', 'aliases': [], 'lsp': ''},
162 \ {'name': 'linter2', 'aliases': []},
164 \ ale#engine#ignore#Exclude(
167 \ {'name': 'linter1', 'aliases': [], 'lsp': ''},
168 \ {'name': 'linter2', 'aliases': []},
169 \ {'name': 'linter3', 'aliases': [], 'lsp': 'stdio'},
175 Execute(Exclude should remove lspconfig linters with ale_disable_lsp = 'auto'):
177 " A map is used here so you can easily see what the ignore mapping should be
178 " remapping the nvim-lspconfig names to.
179 let g:lspconfig_names = keys({
181 \ 'ansiblels': 'ansible-language-server',
182 \ 'bicep': 'bicep_language_server',
183 \ 'cmake': 'cmake_language_server',
185 \ 'erlangls': 'erlang_ls',
186 \ 'html': 'vscodehtml',
187 \ 'ocamlls': 'ocaml-language-server',
188 \ 'puppet': 'puppet_languageserver',
189 \ 'pyright': 'pyright',
192 " We should keep bicep, as it's different tool.
195 \ {'name': 'bicep', 'aliases': []},
197 \ ale#engine#ignore#Exclude(
200 \ {'name': 'adals', 'aliases': []},
201 \ {'name': 'language_server', 'aliases': ['ansible-language-server']},
202 \ {'name': 'cmake_language_server', 'aliases': []},
203 \ {'name': 'deno', 'aliases': []},
204 \ {'name': 'erlang_ls', 'aliases': []},
205 \ {'name': 'vscodehtml', 'aliases': []},
206 \ {'name': 'bicep', 'aliases': []},
207 \ {'name': 'ols', 'aliases': ['ocaml-language-server']},
208 \ {'name': 'languageserver', 'aliases': ['puppet_languageserver']},
209 \ {'name': 'pyright', 'aliases': []},
215 Execute(Exclude should check that the nvim-lspconfig plugin is installed with ale_disable_lsp = 'auto'):
217 let g:lspconfig_names = ['pyright']
219 " We should keep pyright here, because g:lspconfig is 0.
222 \ {'name': 'pyright', 'aliases': []},
224 \ ale#engine#ignore#Exclude(
227 \ {'name': 'pyright', 'aliases': []},
233 Execute(Exclude should handle the lspconfig result being a Dictionary):
235 let g:lspconfig_names = {}
237 " We should keep pyright here, because the configuration is empty.
240 \ {'name': 'pyright', 'aliases': []},
242 \ ale#engine#ignore#Exclude(
245 \ {'name': 'pyright', 'aliases': []},
251 Given foobar(An empty file):
252 Execute(Global ignore lists should be applied for linters):
253 " We have to set up buffer info so RunLinters is called.
254 let g:ale_buffer_info = {bufnr(''): {}}
257 Assert g:run_linters_called, "The mock callback wasn't called"
258 AssertEqual ['testlinter'], map(g:linters, 'v:val.name')
260 let g:ale_linters_ignore = ['testlinter']
262 AssertEqual [], g:linters
264 Execute(buffer ignore lists should be applied for linters):
265 " We have to set up buffer info so RunLinters is called.
266 let g:ale_buffer_info = {bufnr(''): {}}
269 Assert g:run_linters_called, "The mock callback wasn't called"
270 AssertEqual ['testlinter'], map(g:linters, 'v:val.name')
272 let b:ale_linters_ignore = ['testlinter']
274 AssertEqual [], g:linters
276 Execute(Buffer ignore lists should be applied for tsserver):
277 call ale#test#SetFilename('filename.ts')
278 call ale#engine#InitBufferInfo(bufnr(''))
280 let g:lsp_message = {
283 \ 'event': 'syntaxDiag',
285 \ 'file': g:dir . '/filename.ts',
296 \ 'text': ''','' expected.',
303 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
315 \ 'text': ''','' expected.',
321 let b:ale_linters_ignore = ['tsserver']
322 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
324 AssertEqual [], g:loclist
326 Execute(Buffer ignore lists should be applied for LSP linters):
327 call ale#test#SetFilename('filename.py')
328 call ale#engine#InitBufferInfo(bufnr(''))
329 call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'lsplinter', 'aliases': [], 'lsp': 'stdio'}})
331 let g:lsp_message = {
333 \ 'method': 'textDocument/publishDiagnostics',
335 \ 'uri': ale#path#ToFileURI(expand('%:p')),
341 \ 'start': {'line': 0, 'character': 9},
342 \ 'end': {'line': 0, 'character': 9},
349 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
364 let b:ale_linters_ignore = ['lsplinter']
367 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
369 AssertEqual [], g:loclist
371 Execute(ale_disable_lsp should be applied for tsserver):
372 call ale#test#SetFilename('filename.ts')
373 call ale#engine#InitBufferInfo(bufnr(''))
375 let g:lsp_message = {
378 \ 'event': 'syntaxDiag',
380 \ 'file': g:dir . '/filename.ts',
391 \ 'text': ''','' expected.',
398 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
410 \ 'text': ''','' expected.',
416 let b:ale_disable_lsp = 1
417 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
419 AssertEqual [], g:loclist
421 Execute(ale_disable_lsp = 'auto' should be applied for tsserver):
423 let g:lspconfig_names = ['tsserver']
425 call ale#test#SetFilename('filename.ts')
426 call ale#engine#InitBufferInfo(bufnr(''))
428 let g:lsp_message = {
431 \ 'event': 'syntaxDiag',
433 \ 'file': g:dir . '/filename.ts',
444 \ 'text': ''','' expected.',
451 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
463 \ 'text': ''','' expected.',
469 let g:ale_disable_lsp = 'auto'
470 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
472 AssertEqual [], g:loclist
474 Execute(ale_disable_lsp should be applied for LSP linters):
475 call ale#test#SetFilename('filename.py')
476 call ale#engine#InitBufferInfo(bufnr(''))
477 call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'lsplinter', 'aliases': [], 'lsp': 'stdio'}})
479 let g:lsp_message = {
481 \ 'method': 'textDocument/publishDiagnostics',
483 \ 'uri': ale#path#ToFileURI(expand('%:p')),
489 \ 'start': {'line': 0, 'character': 9},
490 \ 'end': {'line': 0, 'character': 9},
497 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
512 let b:ale_disable_lsp = 1
515 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
517 AssertEqual [], g:loclist
519 Execute(ale_disable_lsp = 'auto' should be applied for LSP linters):
521 let g:lspconfig_names = ['lsplinter']
523 call ale#test#SetFilename('filename.py')
524 call ale#engine#InitBufferInfo(bufnr(''))
525 call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'lsplinter', 'aliases': [], 'lsp': 'stdio'}})
527 let g:lsp_message = {
529 \ 'method': 'textDocument/publishDiagnostics',
531 \ 'uri': ale#path#ToFileURI(expand('%:p')),
537 \ 'start': {'line': 0, 'character': 9},
538 \ 'end': {'line': 0, 'character': 9},
545 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
560 let g:ale_disable_lsp = 'auto'
563 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
565 AssertEqual [], g:loclist
567 Execute(ale_disable_lsp = 'auto' should ignore LSP linters by alias too):
569 let g:lspconfig_names = ['lsplinter']
571 call ale#test#SetFilename('filename.py')
572 call ale#engine#InitBufferInfo(bufnr(''))
573 call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'notthis', 'aliases': ['lsplinter'], 'lsp': 'stdio'}})
575 let g:lsp_message = {
577 \ 'method': 'textDocument/publishDiagnostics',
579 \ 'uri': ale#path#ToFileURI(expand('%:p')),
585 \ 'start': {'line': 0, 'character': 9},
586 \ 'end': {'line': 0, 'character': 9},
593 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
608 let g:ale_disable_lsp = 'auto'
611 call ale#lsp_linter#HandleLSPResponse(347, g:lsp_message)
613 AssertEqual [], g:loclist