diff --git a/autoload/ale/linter.vim b/autoload/ale/linter.vim index 6a714d6a..78dcd3a2 100644 --- a/autoload/ale/linter.vim +++ b/autoload/ale/linter.vim @@ -358,12 +358,14 @@ function! ale#linter#Define(filetype, linter) abort " This command will throw from the sandbox. let &l:equalprg=&l:equalprg + let l:new_linter = ale#linter#PreProcess(a:filetype, a:linter) + if !has_key(s:linters, a:filetype) let s:linters[a:filetype] = [] endif - let l:new_linter = ale#linter#PreProcess(a:filetype, a:linter) - + " Remove previously defined linters with the same name. + call filter(s:linters[a:filetype], 'v:val.name isnot# a:linter.name') call add(s:linters[a:filetype], l:new_linter) endfunction diff --git a/test/test_linter_retrieval.vader b/test/test_linter_retrieval.vader index 6f9b3db4..88885b71 100644 --- a/test/test_linter_retrieval.vader +++ b/test/test_linter_retrieval.vader @@ -158,6 +158,14 @@ Execute (Buffer-local overrides for aliases should be used): AssertEqual [g:testlinter1, g:testlinter2], ale#linter#Get('testft1') +Execute (Linters new linters with the same name should replace old ones): + let g:testlinter1.name = g:testlinter2.name + + call ale#linter#Define('testft1', g:testlinter1) + call ale#linter#Define('testft1', g:testlinter2) + + AssertEqual [g:testlinter2], ale#linter#GetAll(['testft1']) + Execute (Linters should be loaded from disk appropriately): call ale#linter#Reset() AssertEqual [{'name': 'testlinter', 'output_stream': 'stdout', 'executable': 'testlinter', 'command': 'testlinter', 'callback': 'testCB', 'read_buffer': 1, 'lint_file': 0, 'aliases': [], 'lsp': ''}], ale#linter#Get('testft')