summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Welch <dwelch2102@gmail.com>2018-10-22 07:24:46 -0500
committerw0rp <w0rp@users.noreply.github.com>2018-10-22 13:24:46 +0100
commit2000436dfd7a25a8e9f66788c94bfb4512adda98 (patch)
tree000bafadbd03a1364481f6ec201c8ef074869a03
parentf57ad883f2ddb0613ffeffa4529269a6bcaf913a (diff)
downloadale-2000436dfd7a25a8e9f66788c94bfb4512adda98.zip
LSP configuration via didChangeConfiguration (#1852)
* adding LSP configuration via workspace/didChangeConfiguration
-rw-r--r--autoload/ale/linter.vim8
-rw-r--r--autoload/ale/lsp/message.vim6
-rw-r--r--autoload/ale/lsp_linter.vim6
-rw-r--r--test/lsp/test_lsp_client_messages.vader16
-rw-r--r--test/test_linter_defintion_processing.vader31
5 files changed, 66 insertions, 1 deletions
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
+