From c7e3f1a0dd447eeafcbbd158974860c1918dbdd5 Mon Sep 17 00:00:00 2001 From: Horacio Sanson Date: Fri, 15 Oct 2021 08:42:07 +0900 Subject: Fix 3207 - do not send didSave notification if not supported (#3930) --- autoload/ale/lsp.vim | 19 ++++++++++++------- autoload/ale/lsp_linter.vim | 1 + test/lsp/test_did_save_event.vader | 24 ++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/autoload/ale/lsp.vim b/autoload/ale/lsp.vim index 510f3e95..75d81525 100644 --- a/autoload/ale/lsp.vim +++ b/autoload/ale/lsp.vim @@ -45,6 +45,7 @@ function! ale#lsp#Register(executable_or_address, project, init_options) abort \ 'typeDefinition': 0, \ 'symbol_search': 0, \ 'code_actions': 0, + \ 'did_save': 0, \ 'includeText': 0, \ }, \} @@ -265,15 +266,19 @@ function! s:UpdateCapabilities(conn, capabilities) abort let a:conn.capabilities.symbol_search = 1 endif - if has_key(a:capabilities, 'textDocumentSync') - if type(a:capabilities.textDocumentSync) is v:t_dict - let l:save = get(a:capabilities.textDocumentSync, 'save', v:false) + if type(get(a:capabilities, 'textDocumentSync')) is v:t_dict + let l:syncOptions = get(a:capabilities, 'textDocumentSync') - if type(l:save) is v:true - let a:conn.capabilities.includeText = 1 - endif + if get(l:syncOptions, 'save') is v:true + let a:conn.capabilities.did_save = 1 + endif + + if type(get(l:syncOptions, 'save')) is v:t_dict + let a:conn.capabilities.did_save = 1 + + let l:saveOptions = get(l:syncOptions, 'save') - if type(l:save) is v:t_dict && get(a:capabilities.textDocumentSync.save, 'includeText', v:false) is v:true + if get(l:saveOptions, 'includeText') is v:true let a:conn.capabilities.includeText = 1 endif endif diff --git a/autoload/ale/lsp_linter.vim b/autoload/ale/lsp_linter.vim index 753fb57b..230b3141 100644 --- a/autoload/ale/lsp_linter.vim +++ b/autoload/ale/lsp_linter.vim @@ -466,6 +466,7 @@ function! s:CheckWithLSP(linter, details) abort " If this was a file save event, also notify the server of that. if a:linter.lsp isnot# 'tsserver' \&& getbufvar(l:buffer, 'ale_save_event_fired', 0) + \&& ale#lsp#HasCapability(l:buffer, 'did_save') let l:include_text = ale#lsp#HasCapability(l:buffer, 'includeText') let l:save_message = ale#lsp#message#DidSave(l:buffer, l:include_text) let l:notified = ale#lsp#Send(l:id, l:save_message) != 0 diff --git a/test/lsp/test_did_save_event.vader b/test/lsp/test_did_save_event.vader index 1d811363..fbec10e5 100644 --- a/test/lsp/test_did_save_event.vader +++ b/test/lsp/test_did_save_event.vader @@ -90,6 +90,30 @@ Given foobar (Some imaginary filetype): Execute(Server should be notified on save): call ale#events#SaveEvent(bufnr('')) + AssertEqual + \ [ + \ [1, 'textDocument/didChange', { + \ 'textDocument': { + \ 'uri': ale#path#ToURI(expand('%:p')), + \ 'version': g:ale_lsp_next_version_id - 1, + \ }, + \ 'contentChanges': [{'text': join(getline(1, '$'), "\n") . "\n"}], + \ }], + \ ], + \ g:message_list + +Execute(Server should be notified on save with didSave is supported by server): + + " Replace has capability function to simulate didSave server capability + function! ale#lsp#HasCapability(conn_id, capability) abort + if a:capability == 'did_save' + return 1 + endif + return 0 + endfunction + + call ale#events#SaveEvent(bufnr('')) + AssertEqual \ [ \ [1, 'textDocument/didChange', { -- cgit v1.2.3