Skip to content

Commit 6ba798d

Browse files
authored
fix expert lsp stdio and register capability (#5113)
* pass --stdio flag to expert lsp server expert requires --stdio to use stdio transport but the linter definition launched it without the flag, so the server never entered lsp mode * handle client/registerCapability requests from lsp servers some lsp servers like expert send a client/registerCapability request after initialization to dynamically register capabilities, if ale does not respond the server blocks and never processes further messages like textDocument/didOpen
1 parent b1b027d commit 6ba798d

4 files changed

Lines changed: 29 additions & 3 deletions

File tree

ale_linters/elixir/expert.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ call ale#linter#Define('elixir', {
77
\ 'name': 'expert',
88
\ 'lsp': 'stdio',
99
\ 'executable': {b -> ale#Var(b, 'elixir_expert_executable')},
10-
\ 'command': '%e',
10+
\ 'command': '%e --stdio',
1111
\ 'project_root': function('ale#handlers#elixir#FindMixUmbrellaRoot'),
1212
\})

autoload/ale/lsp_linter.vim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ function! ale#lsp_linter#HandleLSPResponse(conn_id, response) abort
241241
\ : a:response.result.items
242242

243243
call ale#lsp_linter#HandleLSPDiagnostics(a:conn_id, l:uri, l:diagnostics)
244+
elseif l:method is# 'client/registerCapability'
245+
call ale#lsp#SendResponse(a:conn_id, a:response.id, v:null)
244246
elseif l:method is# 'workspace/configuration'
245247
let l:items = get(get(a:response, 'params', {}), 'items', [])
246248
let l:config = ale#lsp#GetConnectionConfig(a:conn_id)

test/linter/test_elixir_expert.vader

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ After:
55
call ale#assert#TearDownLinterTest()
66

77
Execute(should set correct defaults):
8-
AssertLinter 'expert', ale#Escape('expert')
8+
AssertLinter 'expert', ale#Escape('expert') . ' --stdio'
99

1010
Execute(The executable should be configurable):
1111
let b:ale_elixir_expert_executable = 'foobar'
1212

13-
AssertLinter 'foobar', ale#Escape('foobar')
13+
AssertLinter 'foobar', ale#Escape('foobar') . ' --stdio'
1414

1515
Execute(should set correct LSP values):
1616
call ale#test#SetFilename('../test-files/elixir/umbrella_project/apps/app1/lib/app.ex')

test/lsp/test_engine_lsp_response_handling.vader

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,30 @@ Execute(workspace/configuration requests should be answered with the connection
562562
unlet! g:sent_responses
563563
runtime autoload/ale/lsp.vim
564564

565+
Execute(client/registerCapability requests should be acknowledged):
566+
let g:sent_responses = []
567+
568+
function! ale#lsp#SendResponse(conn_id, id, result) abort
569+
call add(g:sent_responses, [a:conn_id, a:id, a:result])
570+
endfunction
571+
572+
call ale#lsp_linter#SetLSPLinterMap({'1': {'name': 'expert', 'aliases': [], 'lsp': 'stdio'}})
573+
call ale#lsp_linter#HandleLSPResponse(1, {
574+
\ 'jsonrpc': '2.0',
575+
\ 'id': 12,
576+
\ 'method': 'client/registerCapability',
577+
\ 'params': {
578+
\ 'registrations': [{'id': 'abc', 'method': 'textDocument/didSave'}],
579+
\ },
580+
\})
581+
582+
AssertEqual
583+
\ [[1, 12, v:null]],
584+
\ g:sent_responses
585+
586+
unlet! g:sent_responses
587+
runtime autoload/ale/lsp.vim
588+
565589
Execute(LSP errors should be logged in the history):
566590
call ale#lsp_linter#SetLSPLinterMap({'347': {'name': 'foobar', 'aliases': [], 'lsp': 'stdio'}})
567591
call ale#lsp_linter#HandleLSPResponse(347, {

0 commit comments

Comments
 (0)