From 9ddf1b6a050bea6706bd51f2fd5f252c735bc1cc Mon Sep 17 00:00:00 2001 From: w0rp Date: Wed, 4 Jul 2018 13:12:58 +0100 Subject: [PATCH] Make the language option for LSP linters optional --- ale_linters/cpp/cquery.vim | 1 - ale_linters/dart/language_server.vim | 1 - ale_linters/glsl/glslls.vim | 1 - ale_linters/php/langserver.vim | 1 - ale_linters/python/pyls.vim | 1 - ale_linters/python/pyre.vim | 1 - ale_linters/rust/rls.vim | 1 - ale_linters/sh/language_server.vim | 1 - autoload/ale/linter.vim | 23 ++-- doc/ale.txt | 14 ++- test/test_linter_defintion_processing.vader | 132 +++++++++++--------- 11 files changed, 92 insertions(+), 85 deletions(-) diff --git a/ale_linters/cpp/cquery.vim b/ale_linters/cpp/cquery.vim index 2fd77d46..7997c843 100644 --- a/ale_linters/cpp/cquery.vim +++ b/ale_linters/cpp/cquery.vim @@ -30,5 +30,4 @@ call ale#linter#Define('cpp', { \ 'command_callback': 'ale_linters#cpp#cquery#GetCommand', \ 'project_root_callback': 'ale_linters#cpp#cquery#GetProjectRoot', \ 'initialization_options_callback': 'ale_linters#cpp#cquery#GetInitializationOptions', -\ 'language': 'cpp', \}) diff --git a/ale_linters/dart/language_server.vim b/ale_linters/dart/language_server.vim index bed77c52..2265e37a 100644 --- a/ale_linters/dart/language_server.vim +++ b/ale_linters/dart/language_server.vim @@ -20,6 +20,5 @@ call ale#linter#Define('dart', { \ 'lsp': 'stdio', \ 'executable_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', \}) diff --git a/ale_linters/glsl/glslls.vim b/ale_linters/glsl/glslls.vim index c19f28c2..77e30f9c 100644 --- a/ale_linters/glsl/glslls.vim +++ b/ale_linters/glsl/glslls.vim @@ -29,6 +29,5 @@ call ale#linter#Define('glsl', { \ 'lsp': 'stdio', \ 'executable_callback': 'ale_linters#glsl#glslls#GetExecutable', \ 'command_callback': 'ale_linters#glsl#glslls#GetCommand', -\ 'language': 'glsl', \ 'project_root_callback': 'ale_linters#glsl#glslls#GetProjectRoot', \}) diff --git a/ale_linters/php/langserver.vim b/ale_linters/php/langserver.vim index 0f3ead66..38b42df9 100644 --- a/ale_linters/php/langserver.vim +++ b/ale_linters/php/langserver.vim @@ -25,6 +25,5 @@ call ale#linter#Define('php', { \ 'lsp': 'stdio', \ 'executable_callback': 'ale_linters#php#langserver#GetExecutable', \ 'command_callback': 'ale_linters#php#langserver#GetCommand', -\ 'language': 'php', \ 'project_root_callback': 'ale_linters#php#langserver#GetProjectRoot', \}) diff --git a/ale_linters/python/pyls.vim b/ale_linters/python/pyls.vim index 010cb31f..ae71f022 100644 --- a/ale_linters/python/pyls.vim +++ b/ale_linters/python/pyls.vim @@ -23,7 +23,6 @@ call ale#linter#Define('python', { \ 'lsp': 'stdio', \ 'executable_callback': 'ale_linters#python#pyls#GetExecutable', \ 'command_callback': 'ale_linters#python#pyls#GetCommand', -\ 'language': 'python', \ 'project_root_callback': 'ale#python#FindProjectRoot', \ 'completion_filter': 'ale#completion#python#CompletionItemFilter', \}) diff --git a/ale_linters/python/pyre.vim b/ale_linters/python/pyre.vim index 13f77d68..5efef409 100644 --- a/ale_linters/python/pyre.vim +++ b/ale_linters/python/pyre.vim @@ -23,7 +23,6 @@ call ale#linter#Define('python', { \ 'lsp': 'stdio', \ 'executable_callback': 'ale_linters#python#pyre#GetExecutable', \ 'command_callback': 'ale_linters#python#pyre#GetCommand', -\ 'language': 'python', \ 'project_root_callback': 'ale#python#FindProjectRoot', \ 'completion_filter': 'ale#completion#python#CompletionItemFilter', \}) diff --git a/ale_linters/rust/rls.vim b/ale_linters/rust/rls.vim index d5160b14..cd13291d 100644 --- a/ale_linters/rust/rls.vim +++ b/ale_linters/rust/rls.vim @@ -30,6 +30,5 @@ call ale#linter#Define('rust', { \ 'lsp': 'stdio', \ 'executable_callback': 'ale_linters#rust#rls#GetExecutable', \ 'command_callback': 'ale_linters#rust#rls#GetCommand', -\ 'language': 'rust', \ 'project_root_callback': 'ale_linters#rust#rls#GetProjectRoot', \}) diff --git a/ale_linters/sh/language_server.vim b/ale_linters/sh/language_server.vim index 2f66e27b..385d1119 100644 --- a/ale_linters/sh/language_server.vim +++ b/ale_linters/sh/language_server.vim @@ -28,6 +28,5 @@ call ale#linter#Define('sh', { \ 'lsp': 'stdio', \ 'executable_callback': 'ale_linters#sh#language_server#GetExecutable', \ 'command_callback': 'ale_linters#sh#language_server#GetCommand', -\ 'language': 'sh', \ 'project_root_callback': 'ale_linters#sh#language_server#GetProjectRoot', \}) diff --git a/autoload/ale/linter.vim b/autoload/ale/linter.vim index 299f5dad..b0237bcb 100644 --- a/autoload/ale/linter.vim +++ b/autoload/ale/linter.vim @@ -59,7 +59,7 @@ function! s:LanguageGetter(buffer) dict abort return l:self.language endfunction -function! ale#linter#PreProcess(linter) abort +function! ale#linter#PreProcess(filetype, linter) abort if type(a:linter) != type({}) throw 'The linter object must be a Dictionary' endif @@ -193,13 +193,20 @@ function! ale#linter#PreProcess(linter) abort endif 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` ' \ . 'should be set' 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('') throw '`language` must be a string' @@ -207,12 +214,6 @@ function! ale#linter#PreProcess(linter) abort " Make 'language_callback' return the 'language' value. 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 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] = [] 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) endfunction diff --git a/doc/ale.txt b/doc/ale.txt index 232d7630..9283765f 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -2383,9 +2383,12 @@ ale#linter#Define(filetype, linter) *ale#linter#Define()* with a callback returning an address to connect to. ALE will not start a server automatically. - When this argument is not empty, only one of either - `language` or `language_callback` must be defined, - and `project_root_callback` must be defined. + When this argument is not empty + `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 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 tell it what type of language is being checked. - This argument must only be set if the `lsp` argument - is also set to a non-empty string. + If this or `language_callback` isn't set, the + language will default to the value of the filetype + given to |ale#linter#Define|. `language_callback` A |String| or |Funcref| for a callback function accepting a buffer number. A |String| should be diff --git a/test/test_linter_defintion_processing.vader b/test/test_linter_defintion_processing.vader index 48a4a394..f0ec023a 100644 --- a/test/test_linter_defintion_processing.vader +++ b/test/test_linter_defintion_processing.vader @@ -5,11 +5,11 @@ After: unlet g:linter 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 Execute (PreProcess should throw when there is no name): - AssertThrows call ale#linter#PreProcess({ + AssertThrows call ale#linter#PreProcess('testft', { \ 'callback': 'SomeFunction', \ 'executable': '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 Execute (PreProcess should throw when there is no callback): - AssertThrows call ale#linter#PreProcess({ + AssertThrows call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'executable': '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 Execute (PreProcess should throw when then callback is not a function): - AssertThrows call ale#linter#PreProcess({ + AssertThrows call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 1, \ '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 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', \ 'callback': 'SomeFunction', \ '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 Execute (PreProcess should throw when executable is not a string): - AssertThrows call ale#linter#PreProcess({ + AssertThrows call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ '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 Execute (PreProcess should throw when executable_callback is not a callback): - AssertThrows call ale#linter#PreProcess({ + AssertThrows call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ '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 Execute (PreProcess should throw when there is no command): - AssertThrows call ale#linter#PreProcess({ + AssertThrows call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ '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 Execute (PreProcess should throw when command is not a string): - AssertThrows call ale#linter#PreProcess({ + AssertThrows call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ '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 Execute (PreProcess should throw when command_callback is not a callback): - AssertThrows call ale#linter#PreProcess({ + AssertThrows call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ '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 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', \ 'callback': 'SomeFunction', \ '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 Execute (PreProcess should not throw when everything is correct): - call ale#linter#PreProcess({ + call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ 'executable': 'echo', @@ -104,7 +104,7 @@ Execute (PreProcess should not throw when everything is correct): \}) Execute (PreProcess should accept an stdout output_stream): - call ale#linter#PreProcess({ + call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ 'executable': 'echo', @@ -113,7 +113,7 @@ Execute (PreProcess should accept an stdout output_stream): \}) Execute (PreProcess should accept an stderr output_stream): - call ale#linter#PreProcess({ + call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ 'executable': 'echo', @@ -122,7 +122,7 @@ Execute (PreProcess should accept an stderr output_stream): \}) Execute (PreProcess should accept a 'both' output_stream): - call ale#linter#PreProcess({ + call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'callback': 'SomeFunction', \ 'executable': 'echo', @@ -137,7 +137,7 @@ Execute(PreProcess should complain if the command_chain is not a List): \ 'executable': '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 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', \ '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 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', \ '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 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', \ '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 Execute(PreProcess should accept a chain with one callback): @@ -177,7 +177,7 @@ Execute(PreProcess should accept a chain with one callback): \ 'executable': 'x', \ '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): let g:linter = { @@ -186,7 +186,7 @@ Execute(PreProcess should complain about invalid output_stream values in the cha \ 'executable': 'x', \ '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 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', \ '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' - call ale#linter#PreProcess(g:linter) + call ale#linter#PreProcess('testft', g:linter) 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): let g:linter = { @@ -209,7 +209,7 @@ Execute(PreProcess should complain about invalid chain items at higher indices): \ 'executable': 'x', \ '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 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_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 unlet g:linter.command 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 let g:linter.command = 'foo' 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 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', \} - 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 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 - call ale#linter#PreProcess(g:linter) + call ale#linter#PreProcess('testft', g:linter) unlet g:linter.read_buffer 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 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' - 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 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): let g:linter = { @@ -282,7 +282,7 @@ Execute(PreProcess should set a default value for read_buffer): \ '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): let g:linter = { @@ -293,25 +293,25 @@ Execute(PreProcess should process the lint_file option correctly): \ '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 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 - 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 - 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. - 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 " 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 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', \} - 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): let g:linter = { @@ -332,7 +332,7 @@ Execute(PreProcess should set a default value for aliases): \ '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): let g:linter = { @@ -343,12 +343,12 @@ Execute(PreProcess should complain about invalid `aliases` values): \ '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 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 Execute(PreProcess should accept `aliases` lists): @@ -360,11 +360,11 @@ Execute(PreProcess should accept `aliases` lists): \ 'aliases': [], \} - AssertEqual [], ale#linter#PreProcess(g:linter).aliases + AssertEqual [], ale#linter#PreProcess('testft', g:linter).aliases 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): let g:linter = { @@ -376,17 +376,17 @@ Execute(PreProcess should accept tsserver LSP configuration): \ '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') let g:linter.executable_callback = 'X' - call ale#linter#PreProcess(g:linter) + call ale#linter#PreProcess('testft', g:linter) call remove(g:linter, 'command') 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): let g:linter = { @@ -398,17 +398,17 @@ Execute(PreProcess should accept stdio LSP configuration): \ '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') let g:linter.executable_callback = 'X' - call ale#linter#PreProcess(g:linter) + call ale#linter#PreProcess('testft', g:linter) call remove(g:linter, 'command') 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): let g:linter = { @@ -419,7 +419,7 @@ Execute(PreProcess should accept LSP server configurations): \ '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): let g:linter = { @@ -430,7 +430,7 @@ Execute(PreProcess should accept let you specify the language as just a string): \ '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): let g:linter = { @@ -442,16 +442,26 @@ Execute(PreProcess should complain about using language and language_callback to \ '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 +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): let g:linter = { \ 'name': 'x', \ '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 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', \} - 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 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', \} - 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 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', \ 'lsp': 'socket', \ 'address_callback': 'X',