diff --git a/autoload/ale/linter.vim b/autoload/ale/linter.vim index 06bc5e80..0279c0b1 100644 --- a/autoload/ale/linter.vim +++ b/autoload/ale/linter.vim @@ -255,6 +255,14 @@ function! ale#linter#PreProcess(filetype, linter) abort elseif has_key(a:linter, 'initialization_options') let l:obj.initialization_options = a:linter.initialization_options endif + + if has_key(a:linter, 'lsp_config') + if type(a:linter.lsp_config) isnot v:t_dict + throw '`lsp_config` must be a Dictionary' + endif + + let l:obj.lsp_config = a:linter.lsp_config + endif endif let l:obj.output_stream = get(a:linter, 'output_stream', 'stdout') diff --git a/autoload/ale/lsp/message.vim b/autoload/ale/lsp/message.vim index 9e05156d..9ed41ac4 100644 --- a/autoload/ale/lsp/message.vim +++ b/autoload/ale/lsp/message.vim @@ -138,3 +138,9 @@ function! ale#lsp#message#Hover(buffer, line, column) abort \ 'position': {'line': a:line - 1, 'character': a:column}, \}] endfunction + +function! ale#lsp#message#DidChangeConfiguration(buffer, config) abort + return [0, 'workspace/didChangeConfiguration', { + \ 'settings': a:config, + \}] +endfunction diff --git a/autoload/ale/lsp_linter.vim b/autoload/ale/lsp_linter.vim index a11c76bc..55190483 100644 --- a/autoload/ale/lsp_linter.vim +++ b/autoload/ale/lsp_linter.vim @@ -190,6 +190,12 @@ function! ale#lsp_linter#StartLSP(buffer, linter) abort let l:language_id = ale#util#GetFunction(a:linter.language_callback)(a:buffer) + if !empty(get(a:linter, 'lsp_config')) + " set LSP configuration options (workspace/didChangeConfiguration) + let l:config_message = ale#lsp#message#DidChangeConfiguration(a:buffer, a:linter.lsp_config) + call ale#lsp#Send(l:conn_id, l:config_message) + endif + let l:details = { \ 'buffer': a:buffer, \ 'connection_id': l:conn_id, diff --git a/test/lsp/test_lsp_client_messages.vader b/test/lsp/test_lsp_client_messages.vader index dc28c2e9..d4abaad9 100644 --- a/test/lsp/test_lsp_client_messages.vader +++ b/test/lsp/test_lsp_client_messages.vader @@ -175,6 +175,22 @@ Execute(ale#lsp#message#Hover() should return correct messages): \ ], \ ale#lsp#message#Hover(bufnr(''), 12, 34) +Execute(ale#lsp#message#DidChangeConfiguration() should return correct messages): + let g:ale_lsp_configuration = { + \ 'foo': 'bar' + \ } + AssertEqual + \ [ + \ 0, + \ 'workspace/didChangeConfiguration', + \ { + \ 'settings': { + \ 'foo': 'bar', + \ } + \ } + \ ], + \ ale#lsp#message#DidChangeConfiguration(bufnr(''), g:ale_lsp_configuration) + Execute(ale#lsp#tsserver_message#Open() should return correct messages): AssertEqual \ [ diff --git a/test/test_linter_defintion_processing.vader b/test/test_linter_defintion_processing.vader index f0ec023a..a28edf9e 100644 --- a/test/test_linter_defintion_processing.vader +++ b/test/test_linter_defintion_processing.vader @@ -490,7 +490,7 @@ Execute(PreProcess should complain about using initialization_options and initia 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): +Execute(PreProcess should throw when initialization_options_callback is not a callback): AssertThrows call ale#linter#PreProcess('testft', { \ 'name': 'foo', \ 'lsp': 'socket', @@ -500,3 +500,32 @@ Execute (PreProcess should throw when initialization_options_callback is not a c \ 'initialization_options_callback': {}, \}) AssertEqual '`initialization_options_callback` must be a callback if defined', g:vader_exception + +Execute(PreProcess should accept LSP configuration options via lsp_config): + let g:ale_lsp_configuration = { + \ 'foo': 'bar' + \} + + let g:linter = { + \ 'name': 'x', + \ 'lsp': 'socket', + \ 'address_callback': 'X', + \ 'language_callback': 'x', + \ 'project_root_callback': 'x', + \ 'lsp_config': g:ale_lsp_configuration, + \} + + AssertEqual {'foo': 'bar'}, ale#linter#PreProcess('testft', g:linter).lsp_config + + +Execute(PreProcess should throw when lsp_config is not a Dictionary): + AssertThrows call ale#linter#PreProcess('testft', { + \ 'name': 'foo', + \ 'lsp': 'socket', + \ 'address_callback': 'X', + \ 'language': 'x', + \ 'project_root_callback': 'x', + \ 'lsp_config': 'x', + \}) + AssertEqual '`lsp_config` must be a Dictionary', g:vader_exception +