Make the language option for LSP linters optional

This commit is contained in:
w0rp 2018-07-04 13:12:58 +01:00
parent 00a3859304
commit 9ddf1b6a05
No known key found for this signature in database
GPG Key ID: 0FC1ECAA8C81CD83
11 changed files with 92 additions and 85 deletions

View File

@ -30,5 +30,4 @@ call ale#linter#Define('cpp', {
\ 'command_callback': 'ale_linters#cpp#cquery#GetCommand', \ 'command_callback': 'ale_linters#cpp#cquery#GetCommand',
\ 'project_root_callback': 'ale_linters#cpp#cquery#GetProjectRoot', \ 'project_root_callback': 'ale_linters#cpp#cquery#GetProjectRoot',
\ 'initialization_options_callback': 'ale_linters#cpp#cquery#GetInitializationOptions', \ 'initialization_options_callback': 'ale_linters#cpp#cquery#GetInitializationOptions',
\ 'language': 'cpp',
\}) \})

View File

@ -20,6 +20,5 @@ call ale#linter#Define('dart', {
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable_callback': 'ale_linters#dart#language_server#GetExecutable', \ 'executable_callback': 'ale_linters#dart#language_server#GetExecutable',
\ 'command_callback': 'ale_linters#dart#language_server#GetExecutable', \ 'command_callback': 'ale_linters#dart#language_server#GetExecutable',
\ 'language': 'dart',
\ 'project_root_callback': 'ale_linters#dart#language_server#GetProjectRoot', \ 'project_root_callback': 'ale_linters#dart#language_server#GetProjectRoot',
\}) \})

View File

@ -29,6 +29,5 @@ call ale#linter#Define('glsl', {
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable_callback': 'ale_linters#glsl#glslls#GetExecutable', \ 'executable_callback': 'ale_linters#glsl#glslls#GetExecutable',
\ 'command_callback': 'ale_linters#glsl#glslls#GetCommand', \ 'command_callback': 'ale_linters#glsl#glslls#GetCommand',
\ 'language': 'glsl',
\ 'project_root_callback': 'ale_linters#glsl#glslls#GetProjectRoot', \ 'project_root_callback': 'ale_linters#glsl#glslls#GetProjectRoot',
\}) \})

View File

@ -25,6 +25,5 @@ call ale#linter#Define('php', {
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable_callback': 'ale_linters#php#langserver#GetExecutable', \ 'executable_callback': 'ale_linters#php#langserver#GetExecutable',
\ 'command_callback': 'ale_linters#php#langserver#GetCommand', \ 'command_callback': 'ale_linters#php#langserver#GetCommand',
\ 'language': 'php',
\ 'project_root_callback': 'ale_linters#php#langserver#GetProjectRoot', \ 'project_root_callback': 'ale_linters#php#langserver#GetProjectRoot',
\}) \})

View File

@ -23,7 +23,6 @@ call ale#linter#Define('python', {
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable_callback': 'ale_linters#python#pyls#GetExecutable', \ 'executable_callback': 'ale_linters#python#pyls#GetExecutable',
\ 'command_callback': 'ale_linters#python#pyls#GetCommand', \ 'command_callback': 'ale_linters#python#pyls#GetCommand',
\ 'language': 'python',
\ 'project_root_callback': 'ale#python#FindProjectRoot', \ 'project_root_callback': 'ale#python#FindProjectRoot',
\ 'completion_filter': 'ale#completion#python#CompletionItemFilter', \ 'completion_filter': 'ale#completion#python#CompletionItemFilter',
\}) \})

View File

@ -23,7 +23,6 @@ call ale#linter#Define('python', {
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable_callback': 'ale_linters#python#pyre#GetExecutable', \ 'executable_callback': 'ale_linters#python#pyre#GetExecutable',
\ 'command_callback': 'ale_linters#python#pyre#GetCommand', \ 'command_callback': 'ale_linters#python#pyre#GetCommand',
\ 'language': 'python',
\ 'project_root_callback': 'ale#python#FindProjectRoot', \ 'project_root_callback': 'ale#python#FindProjectRoot',
\ 'completion_filter': 'ale#completion#python#CompletionItemFilter', \ 'completion_filter': 'ale#completion#python#CompletionItemFilter',
\}) \})

View File

@ -30,6 +30,5 @@ call ale#linter#Define('rust', {
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable_callback': 'ale_linters#rust#rls#GetExecutable', \ 'executable_callback': 'ale_linters#rust#rls#GetExecutable',
\ 'command_callback': 'ale_linters#rust#rls#GetCommand', \ 'command_callback': 'ale_linters#rust#rls#GetCommand',
\ 'language': 'rust',
\ 'project_root_callback': 'ale_linters#rust#rls#GetProjectRoot', \ 'project_root_callback': 'ale_linters#rust#rls#GetProjectRoot',
\}) \})

View File

@ -28,6 +28,5 @@ call ale#linter#Define('sh', {
\ 'lsp': 'stdio', \ 'lsp': 'stdio',
\ 'executable_callback': 'ale_linters#sh#language_server#GetExecutable', \ 'executable_callback': 'ale_linters#sh#language_server#GetExecutable',
\ 'command_callback': 'ale_linters#sh#language_server#GetCommand', \ 'command_callback': 'ale_linters#sh#language_server#GetCommand',
\ 'language': 'sh',
\ 'project_root_callback': 'ale_linters#sh#language_server#GetProjectRoot', \ 'project_root_callback': 'ale_linters#sh#language_server#GetProjectRoot',
\}) \})

View File

@ -59,7 +59,7 @@ function! s:LanguageGetter(buffer) dict abort
return l:self.language return l:self.language
endfunction endfunction
function! ale#linter#PreProcess(linter) abort function! ale#linter#PreProcess(filetype, linter) abort
if type(a:linter) != type({}) if type(a:linter) != type({})
throw 'The linter object must be a Dictionary' throw 'The linter object must be a Dictionary'
endif endif
@ -193,13 +193,20 @@ function! ale#linter#PreProcess(linter) abort
endif endif
if l:needs_lsp_details if l:needs_lsp_details
if has_key(a:linter, 'language') if has_key(a:linter, 'language_callback')
if has_key(a:linter, 'language_callback') if has_key(a:linter, 'language')
throw 'Only one of `language` or `language_callback` ' throw 'Only one of `language` or `language_callback` '
\ . 'should be set' \ . 'should be set'
endif endif
let l:obj.language = get(a:linter, 'language') let l:obj.language_callback = get(a:linter, 'language_callback')
if !s:IsCallback(l:obj.language_callback)
throw '`language_callback` must be a callback for LSP linters'
endif
else
" Default to using the filetype as the language.
let l:obj.language = get(a:linter, 'language', a:filetype)
if type(l:obj.language) != type('') if type(l:obj.language) != type('')
throw '`language` must be a string' throw '`language` must be a string'
@ -207,12 +214,6 @@ function! ale#linter#PreProcess(linter) abort
" Make 'language_callback' return the 'language' value. " Make 'language_callback' return the 'language' value.
let l:obj.language_callback = function('s:LanguageGetter') let l:obj.language_callback = function('s:LanguageGetter')
else
let l:obj.language_callback = get(a:linter, 'language_callback')
if !s:IsCallback(l:obj.language_callback)
throw '`language_callback` must be a callback for LSP linters'
endif
endif endif
let l:obj.project_root_callback = get(a:linter, 'project_root_callback') let l:obj.project_root_callback = get(a:linter, 'project_root_callback')
@ -286,7 +287,7 @@ function! ale#linter#Define(filetype, linter) abort
let s:linters[a:filetype] = [] let s:linters[a:filetype] = []
endif endif
let l:new_linter = ale#linter#PreProcess(a:linter) let l:new_linter = ale#linter#PreProcess(a:filetype, a:linter)
call add(s:linters[a:filetype], l:new_linter) call add(s:linters[a:filetype], l:new_linter)
endfunction endfunction

View File

@ -2383,9 +2383,12 @@ ale#linter#Define(filetype, linter) *ale#linter#Define()*
with a callback returning an address to connect to. with a callback returning an address to connect to.
ALE will not start a server automatically. ALE will not start a server automatically.
When this argument is not empty, only one of either When this argument is not empty
`language` or `language_callback` must be defined, `project_root_callback` must be defined.
and `project_root_callback` must be defined.
`language` or `language_callback` can be defined to
describe the language for a file. The filetype will
be used as the language by default.
LSP linters handle diagnostics automatically, so LSP linters handle diagnostics automatically, so
the `callback` argument must not be defined. the `callback` argument must not be defined.
@ -2418,8 +2421,9 @@ ale#linter#Define(filetype, linter) *ale#linter#Define()*
being checked. This string will be sent to the LSP to being checked. This string will be sent to the LSP to
tell it what type of language is being checked. tell it what type of language is being checked.
This argument must only be set if the `lsp` argument If this or `language_callback` isn't set, the
is also set to a non-empty string. language will default to the value of the filetype
given to |ale#linter#Define|.
`language_callback` A |String| or |Funcref| for a callback function `language_callback` A |String| or |Funcref| for a callback function
accepting a buffer number. A |String| should be accepting a buffer number. A |String| should be

View File

@ -5,11 +5,11 @@ After:
unlet g:linter unlet g:linter
Execute (PreProcess should throw when the linter object is not a Dictionary): Execute (PreProcess should throw when the linter object is not a Dictionary):
AssertThrows call ale#linter#PreProcess('') AssertThrows call ale#linter#PreProcess('testft', '')
AssertEqual 'The linter object must be a Dictionary', g:vader_exception AssertEqual 'The linter object must be a Dictionary', g:vader_exception
Execute (PreProcess should throw when there is no name): Execute (PreProcess should throw when there is no name):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
\ 'command': 'echo', \ 'command': 'echo',
@ -17,7 +17,7 @@ Execute (PreProcess should throw when there is no name):
AssertEqual '`name` must be defined to name the linter', g:vader_exception AssertEqual '`name` must be defined to name the linter', g:vader_exception
Execute (PreProcess should throw when there is no callback): Execute (PreProcess should throw when there is no callback):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'executable': 'echo', \ 'executable': 'echo',
\ 'command': 'echo', \ 'command': 'echo',
@ -25,7 +25,7 @@ Execute (PreProcess should throw when there is no callback):
AssertEqual '`callback` must be defined with a callback to accept output', g:vader_exception AssertEqual '`callback` must be defined with a callback to accept output', g:vader_exception
Execute (PreProcess should throw when then callback is not a function): Execute (PreProcess should throw when then callback is not a function):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 1, \ 'callback': 1,
\ 'executable': 'echo', \ 'executable': 'echo',
@ -34,7 +34,7 @@ Execute (PreProcess should throw when then callback is not a function):
AssertEqual '`callback` must be defined with a callback to accept output', g:vader_exception AssertEqual '`callback` must be defined with a callback to accept output', g:vader_exception
Execute (PreProcess should throw when there is no executable or executable_callback): Execute (PreProcess should throw when there is no executable or executable_callback):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'command': 'echo', \ 'command': 'echo',
@ -42,7 +42,7 @@ Execute (PreProcess should throw when there is no executable or executable_callb
AssertEqual 'Either `executable` or `executable_callback` must be defined', g:vader_exception AssertEqual 'Either `executable` or `executable_callback` must be defined', g:vader_exception
Execute (PreProcess should throw when executable is not a string): Execute (PreProcess should throw when executable is not a string):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 123, \ 'executable': 123,
@ -51,7 +51,7 @@ Execute (PreProcess should throw when executable is not a string):
AssertEqual '`executable` must be a string if defined', g:vader_exception AssertEqual '`executable` must be a string if defined', g:vader_exception
Execute (PreProcess should throw when executable_callback is not a callback): Execute (PreProcess should throw when executable_callback is not a callback):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable_callback': 123, \ 'executable_callback': 123,
@ -60,7 +60,7 @@ Execute (PreProcess should throw when executable_callback is not a callback):
AssertEqual '`executable_callback` must be a callback if defined', g:vader_exception AssertEqual '`executable_callback` must be a callback if defined', g:vader_exception
Execute (PreProcess should throw when there is no command): Execute (PreProcess should throw when there is no command):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
@ -68,7 +68,7 @@ Execute (PreProcess should throw when there is no command):
AssertEqual 'Either `command`, `executable_callback`, `command_chain` must be defined', g:vader_exception AssertEqual 'Either `command`, `executable_callback`, `command_chain` must be defined', g:vader_exception
Execute (PreProcess should throw when command is not a string): Execute (PreProcess should throw when command is not a string):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
@ -77,7 +77,7 @@ Execute (PreProcess should throw when command is not a string):
AssertEqual '`command` must be a string if defined', g:vader_exception AssertEqual '`command` must be a string if defined', g:vader_exception
Execute (PreProcess should throw when command_callback is not a callback): Execute (PreProcess should throw when command_callback is not a callback):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
@ -86,7 +86,7 @@ Execute (PreProcess should throw when command_callback is not a callback):
AssertEqual '`command_callback` must be a callback if defined', g:vader_exception AssertEqual '`command_callback` must be a callback if defined', g:vader_exception
Execute (PreProcess should when the output stream isn't a valid string): Execute (PreProcess should when the output stream isn't a valid string):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
@ -96,7 +96,7 @@ Execute (PreProcess should when the output stream isn't a valid string):
AssertEqual "`output_stream` must be 'stdout', 'stderr', or 'both'", g:vader_exception AssertEqual "`output_stream` must be 'stdout', 'stderr', or 'both'", g:vader_exception
Execute (PreProcess should not throw when everything is correct): Execute (PreProcess should not throw when everything is correct):
call ale#linter#PreProcess({ call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
@ -104,7 +104,7 @@ Execute (PreProcess should not throw when everything is correct):
\}) \})
Execute (PreProcess should accept an stdout output_stream): Execute (PreProcess should accept an stdout output_stream):
call ale#linter#PreProcess({ call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
@ -113,7 +113,7 @@ Execute (PreProcess should accept an stdout output_stream):
\}) \})
Execute (PreProcess should accept an stderr output_stream): Execute (PreProcess should accept an stderr output_stream):
call ale#linter#PreProcess({ call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
@ -122,7 +122,7 @@ Execute (PreProcess should accept an stderr output_stream):
\}) \})
Execute (PreProcess should accept a 'both' output_stream): Execute (PreProcess should accept a 'both' output_stream):
call ale#linter#PreProcess({ call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'callback': 'SomeFunction', \ 'callback': 'SomeFunction',
\ 'executable': 'echo', \ 'executable': 'echo',
@ -137,7 +137,7 @@ Execute(PreProcess should complain if the command_chain is not a List):
\ 'executable': 'x', \ 'executable': 'x',
\ 'command_chain': 'x', \ 'command_chain': 'x',
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual '`command_chain` must be a List', g:vader_exception AssertEqual '`command_chain` must be a List', g:vader_exception
Execute(PreProcess should complain if the command_chain is empty): Execute(PreProcess should complain if the command_chain is empty):
@ -147,7 +147,7 @@ Execute(PreProcess should complain if the command_chain is empty):
\ 'executable': 'x', \ 'executable': 'x',
\ 'command_chain': [], \ 'command_chain': [],
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual '`command_chain` must contain at least one item', g:vader_exception AssertEqual '`command_chain` must contain at least one item', g:vader_exception
Execute(PreProcess should complain if the command_chain has no callback): Execute(PreProcess should complain if the command_chain has no callback):
@ -157,7 +157,7 @@ Execute(PreProcess should complain if the command_chain has no callback):
\ 'executable': 'x', \ 'executable': 'x',
\ 'command_chain': [{}], \ 'command_chain': [{}],
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'The `command_chain` item 0 must define a `callback` function', g:vader_exception AssertEqual 'The `command_chain` item 0 must define a `callback` function', g:vader_exception
Execute(PreProcess should complain if the command_chain callback is not a function): Execute(PreProcess should complain if the command_chain callback is not a function):
@ -167,7 +167,7 @@ Execute(PreProcess should complain if the command_chain callback is not a functi
\ 'executable': 'x', \ 'executable': 'x',
\ 'command_chain': [{'callback': 2}], \ 'command_chain': [{'callback': 2}],
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'The `command_chain` item 0 must define a `callback` function', g:vader_exception AssertEqual 'The `command_chain` item 0 must define a `callback` function', g:vader_exception
Execute(PreProcess should accept a chain with one callback): Execute(PreProcess should accept a chain with one callback):
@ -177,7 +177,7 @@ Execute(PreProcess should accept a chain with one callback):
\ 'executable': 'x', \ 'executable': 'x',
\ 'command_chain': [{'callback': 'foo'}], \ 'command_chain': [{'callback': 'foo'}],
\} \}
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
Execute(PreProcess should complain about invalid output_stream values in the chain): Execute(PreProcess should complain about invalid output_stream values in the chain):
let g:linter = { let g:linter = {
@ -186,7 +186,7 @@ Execute(PreProcess should complain about invalid output_stream values in the cha
\ 'executable': 'x', \ 'executable': 'x',
\ 'command_chain': [{'callback': 'foo', 'output_stream': ''}], \ 'command_chain': [{'callback': 'foo', 'output_stream': ''}],
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual "The `command_chain` item 0 `output_stream` flag must be 'stdout', 'stderr', or 'both'", g:vader_exception AssertEqual "The `command_chain` item 0 `output_stream` flag must be 'stdout', 'stderr', or 'both'", g:vader_exception
Execute(PreProcess should complain about valid output_stream values in the chain): Execute(PreProcess should complain about valid output_stream values in the chain):
@ -196,11 +196,11 @@ Execute(PreProcess should complain about valid output_stream values in the chain
\ 'executable': 'x', \ 'executable': 'x',
\ 'command_chain': [{'callback': 'foo', 'output_stream': 'stdout'}], \ 'command_chain': [{'callback': 'foo', 'output_stream': 'stdout'}],
\} \}
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
let g:linter.command_chain[0].output_stream = 'stderr' let g:linter.command_chain[0].output_stream = 'stderr'
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
let g:linter.command_chain[0].output_stream = 'both' let g:linter.command_chain[0].output_stream = 'both'
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
Execute(PreProcess should complain about invalid chain items at higher indices): Execute(PreProcess should complain about invalid chain items at higher indices):
let g:linter = { let g:linter = {
@ -209,7 +209,7 @@ Execute(PreProcess should complain about invalid chain items at higher indices):
\ 'executable': 'x', \ 'executable': 'x',
\ 'command_chain': [{'callback': 'foo'}, {'callback': 123}], \ 'command_chain': [{'callback': 'foo'}, {'callback': 123}],
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'The `command_chain` item 1 must define a `callback` function', g:vader_exception AssertEqual 'The `command_chain` item 1 must define a `callback` function', g:vader_exception
Execute(PreProcess should complain when conflicting command options are used): Execute(PreProcess should complain when conflicting command options are used):
@ -220,19 +220,19 @@ Execute(PreProcess should complain when conflicting command options are used):
\ 'command': 'foo', \ 'command': 'foo',
\ 'command_chain': [{'callback': 'foo'}], \ 'command_chain': [{'callback': 'foo'}],
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception
unlet g:linter.command unlet g:linter.command
let g:linter.command_callback = 'foo' let g:linter.command_callback = 'foo'
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception
let g:linter.command = 'foo' let g:linter.command = 'foo'
unlet g:linter.command_chain unlet g:linter.command_chain
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception AssertEqual 'Only one of `command`, `command_callback`, or `command_chain` should be set', g:vader_exception
Execute(PreProcess should process the read_buffer option correctly): Execute(PreProcess should process the read_buffer option correctly):
@ -244,35 +244,35 @@ Execute(PreProcess should process the read_buffer option correctly):
\ 'read_buffer': '0', \ 'read_buffer': '0',
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual '`read_buffer` must be `0` or `1`', g:vader_exception AssertEqual '`read_buffer` must be `0` or `1`', g:vader_exception
let g:linter.read_buffer = 0 let g:linter.read_buffer = 0
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
let g:linter.read_buffer = 1 let g:linter.read_buffer = 1
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
unlet g:linter.read_buffer unlet g:linter.read_buffer
let g:linter.command_chain[0].read_buffer = '0' let g:linter.command_chain[0].read_buffer = '0'
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'The `command_chain` item 0 value for `read_buffer` must be `0` or `1`', g:vader_exception AssertEqual 'The `command_chain` item 0 value for `read_buffer` must be `0` or `1`', g:vader_exception
let g:linter.command_chain[0].read_buffer = 0 let g:linter.command_chain[0].read_buffer = 0
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
let g:linter.command_chain[1].read_buffer = '0' let g:linter.command_chain[1].read_buffer = '0'
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'The `command_chain` item 1 value for `read_buffer` must be `0` or `1`', g:vader_exception AssertEqual 'The `command_chain` item 1 value for `read_buffer` must be `0` or `1`', g:vader_exception
let g:linter.command_chain[1].read_buffer = 1 let g:linter.command_chain[1].read_buffer = 1
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
Execute(PreProcess should set a default value for read_buffer): Execute(PreProcess should set a default value for read_buffer):
let g:linter = { let g:linter = {
@ -282,7 +282,7 @@ Execute(PreProcess should set a default value for read_buffer):
\ 'command': 'x', \ 'command': 'x',
\} \}
AssertEqual 1, ale#linter#PreProcess(g:linter).read_buffer AssertEqual 1, ale#linter#PreProcess('testft', g:linter).read_buffer
Execute(PreProcess should process the lint_file option correctly): Execute(PreProcess should process the lint_file option correctly):
let g:linter = { let g:linter = {
@ -293,25 +293,25 @@ Execute(PreProcess should process the lint_file option correctly):
\ 'lint_file': 'x', \ 'lint_file': 'x',
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual '`lint_file` must be `0` or `1`', g:vader_exception AssertEqual '`lint_file` must be `0` or `1`', g:vader_exception
let g:linter.lint_file = 0 let g:linter.lint_file = 0
AssertEqual 0, ale#linter#PreProcess(g:linter).lint_file AssertEqual 0, ale#linter#PreProcess('testft', g:linter).lint_file
" The default for read_buffer should be 1 when lint_file is 0 " The default for read_buffer should be 1 when lint_file is 0
AssertEqual 1, ale#linter#PreProcess(g:linter).read_buffer AssertEqual 1, ale#linter#PreProcess('testft', g:linter).read_buffer
let g:linter.lint_file = 1 let g:linter.lint_file = 1
AssertEqual 1, ale#linter#PreProcess(g:linter).lint_file AssertEqual 1, ale#linter#PreProcess('testft', g:linter).lint_file
" The default for read_buffer should change to 0 when lint_file is 1. " The default for read_buffer should change to 0 when lint_file is 1.
AssertEqual 0, ale#linter#PreProcess(g:linter).read_buffer AssertEqual 0, ale#linter#PreProcess('testft', g:linter).read_buffer
let g:linter.read_buffer = 1 let g:linter.read_buffer = 1
" We shouldn't be able to set both options to 1 at the same time. " We shouldn't be able to set both options to 1 at the same time.
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'Only one of `lint_file` or `read_buffer` can be `1`', g:vader_exception AssertEqual 'Only one of `lint_file` or `read_buffer` can be `1`', g:vader_exception
Execute(PreProcess should set a default value for lint_file): Execute(PreProcess should set a default value for lint_file):
@ -322,7 +322,7 @@ Execute(PreProcess should set a default value for lint_file):
\ 'command': 'x', \ 'command': 'x',
\} \}
AssertEqual 0, ale#linter#PreProcess(g:linter).lint_file AssertEqual 0, ale#linter#PreProcess('testft', g:linter).lint_file
Execute(PreProcess should set a default value for aliases): Execute(PreProcess should set a default value for aliases):
let g:linter = { let g:linter = {
@ -332,7 +332,7 @@ Execute(PreProcess should set a default value for aliases):
\ 'command': 'x', \ 'command': 'x',
\} \}
AssertEqual [], ale#linter#PreProcess(g:linter).aliases AssertEqual [], ale#linter#PreProcess('testft', g:linter).aliases
Execute(PreProcess should complain about invalid `aliases` values): Execute(PreProcess should complain about invalid `aliases` values):
let g:linter = { let g:linter = {
@ -343,12 +343,12 @@ Execute(PreProcess should complain about invalid `aliases` values):
\ 'aliases': 'foo', \ 'aliases': 'foo',
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual '`aliases` must be a List of String values', g:vader_exception AssertEqual '`aliases` must be a List of String values', g:vader_exception
let g:linter.aliases = [1] let g:linter.aliases = [1]
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual '`aliases` must be a List of String values', g:vader_exception AssertEqual '`aliases` must be a List of String values', g:vader_exception
Execute(PreProcess should accept `aliases` lists): Execute(PreProcess should accept `aliases` lists):
@ -360,11 +360,11 @@ Execute(PreProcess should accept `aliases` lists):
\ 'aliases': [], \ 'aliases': [],
\} \}
AssertEqual [], ale#linter#PreProcess(g:linter).aliases AssertEqual [], ale#linter#PreProcess('testft', g:linter).aliases
let g:linter.aliases = ['foo', 'bar'] let g:linter.aliases = ['foo', 'bar']
AssertEqual ['foo', 'bar'], ale#linter#PreProcess(g:linter).aliases AssertEqual ['foo', 'bar'], ale#linter#PreProcess('testft', g:linter).aliases
Execute(PreProcess should accept tsserver LSP configuration): Execute(PreProcess should accept tsserver LSP configuration):
let g:linter = { let g:linter = {
@ -376,17 +376,17 @@ Execute(PreProcess should accept tsserver LSP configuration):
\ 'project_root_callback': 'x', \ 'project_root_callback': 'x',
\} \}
AssertEqual 'tsserver', ale#linter#PreProcess(g:linter).lsp AssertEqual 'tsserver', ale#linter#PreProcess('testft', g:linter).lsp
call remove(g:linter, 'executable') call remove(g:linter, 'executable')
let g:linter.executable_callback = 'X' let g:linter.executable_callback = 'X'
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
call remove(g:linter, 'command') call remove(g:linter, 'command')
let g:linter.command_callback = 'X' let g:linter.command_callback = 'X'
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
Execute(PreProcess should accept stdio LSP configuration): Execute(PreProcess should accept stdio LSP configuration):
let g:linter = { let g:linter = {
@ -398,17 +398,17 @@ Execute(PreProcess should accept stdio LSP configuration):
\ 'project_root_callback': 'x', \ 'project_root_callback': 'x',
\} \}
AssertEqual 'stdio', ale#linter#PreProcess(g:linter).lsp AssertEqual 'stdio', ale#linter#PreProcess('testft', g:linter).lsp
call remove(g:linter, 'executable') call remove(g:linter, 'executable')
let g:linter.executable_callback = 'X' let g:linter.executable_callback = 'X'
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
call remove(g:linter, 'command') call remove(g:linter, 'command')
let g:linter.command_callback = 'X' let g:linter.command_callback = 'X'
call ale#linter#PreProcess(g:linter) call ale#linter#PreProcess('testft', g:linter)
Execute(PreProcess should accept LSP server configurations): Execute(PreProcess should accept LSP server configurations):
let g:linter = { let g:linter = {
@ -419,7 +419,7 @@ Execute(PreProcess should accept LSP server configurations):
\ 'project_root_callback': 'x', \ 'project_root_callback': 'x',
\} \}
AssertEqual 'socket', ale#linter#PreProcess(g:linter).lsp AssertEqual 'socket', ale#linter#PreProcess('testft', g:linter).lsp
Execute(PreProcess should accept let you specify the language as just a string): Execute(PreProcess should accept let you specify the language as just a string):
let g:linter = { let g:linter = {
@ -430,7 +430,7 @@ Execute(PreProcess should accept let you specify the language as just a string):
\ 'project_root_callback': 'x', \ 'project_root_callback': 'x',
\} \}
AssertEqual 'foobar', ale#linter#PreProcess(g:linter).language_callback(0) AssertEqual 'foobar', ale#linter#PreProcess('testft', g:linter).language_callback(0)
Execute(PreProcess should complain about using language and language_callback together): Execute(PreProcess should complain about using language and language_callback together):
let g:linter = { let g:linter = {
@ -442,16 +442,26 @@ Execute(PreProcess should complain about using language and language_callback to
\ 'project_root_callback': 'x', \ 'project_root_callback': 'x',
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'Only one of `language` or `language_callback` should be set', g:vader_exception AssertEqual 'Only one of `language` or `language_callback` should be set', g:vader_exception
Execute(PreProcess should use the filetype as the language string by default):
let g:linter = {
\ 'name': 'x',
\ 'lsp': 'socket',
\ 'address_callback': 'X',
\ 'project_root_callback': 'x',
\}
AssertEqual 'testft', ale#linter#PreProcess('testft', g:linter).language_callback(0)
Execute(PreProcess should require an address_callback for LSP socket configurations): Execute(PreProcess should require an address_callback for LSP socket configurations):
let g:linter = { let g:linter = {
\ 'name': 'x', \ 'name': 'x',
\ 'lsp': 'socket', \ 'lsp': 'socket',
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual '`address_callback` must be defined for getting the LSP address', g:vader_exception AssertEqual '`address_callback` must be defined for getting the LSP address', g:vader_exception
Execute(PreProcess should complain about address_callback for non-LSP linters): Execute(PreProcess should complain about address_callback for non-LSP linters):
@ -463,7 +473,7 @@ Execute(PreProcess should complain about address_callback for non-LSP linters):
\ 'address_callback': 'X', \ 'address_callback': 'X',
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual '`address_callback` cannot be used when lsp != ''socket''', g:vader_exception AssertEqual '`address_callback` cannot be used when lsp != ''socket''', g:vader_exception
Execute(PreProcess should complain about using initialization_options and initialization_options_callback together): Execute(PreProcess should complain about using initialization_options and initialization_options_callback together):
@ -477,11 +487,11 @@ Execute(PreProcess should complain about using initialization_options and initia
\ 'initialization_options_callback': 'x', \ 'initialization_options_callback': 'x',
\} \}
AssertThrows call ale#linter#PreProcess(g:linter) AssertThrows call ale#linter#PreProcess('testft', g:linter)
AssertEqual 'Only one of `initialization_options` or `initialization_options_callback` should be set', g:vader_exception AssertEqual 'Only one of `initialization_options` or `initialization_options_callback` should be set', g:vader_exception
Execute (PreProcess should throw when initialization_options_callback is not a callback): Execute (PreProcess should throw when initialization_options_callback is not a callback):
AssertThrows call ale#linter#PreProcess({ AssertThrows call ale#linter#PreProcess('testft', {
\ 'name': 'foo', \ 'name': 'foo',
\ 'lsp': 'socket', \ 'lsp': 'socket',
\ 'address_callback': 'X', \ 'address_callback': 'X',