From: Yegappan Lakshmanan Date: Sun, 9 Jul 2023 16:54:53 +0000 (-0700) Subject: Diags are not highlighted after a buffer is reloaded X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=6e4ba228eaa0770470060d8d47a360bd05a04ee5;p=vim-lsp.git Diags are not highlighted after a buffer is reloaded --- diff --git a/autoload/lsp/diag.vim b/autoload/lsp/diag.vim index 583c020..263c07c 100644 --- a/autoload/lsp/diag.vim +++ b/autoload/lsp/diag.vim @@ -208,7 +208,7 @@ enddef # Refresh the placed diagnostics in buffer "bnr" # This inline signs, inline props, and virtual text diagnostics -def DiagsRefresh(bnr: number) +export def DiagsRefresh(bnr: number) :silent! bnr->bufload() RemoveDiagVisualsForBuffer(bnr) diff --git a/autoload/lsp/lsp.vim b/autoload/lsp/lsp.vim index 7b9ed68..66387ca 100644 --- a/autoload/lsp/lsp.vim +++ b/autoload/lsp/lsp.vim @@ -529,6 +529,23 @@ export def RemoveFile(bnr: number): void endfor enddef +# Buffer 'bnr' is loaded in a window, send the latest buffer contents to the +# language servers. +export def BufferLoadedInWin(bnr: number) + var lspservers: list> = buf.BufLspServersGet(bnr) + if lspservers->empty() + # No language servers for this buffer + return + endif + for lspserver in lspservers + if !lspserver->empty() && lspserver.ready + lspserver.textdocDidChange(bnr, 0, 0, 0, []) + endif + endfor + # Refresh the displayed diags visuals + diag.DiagsRefresh(bnr) +enddef + # Stop all the LSP servers export def StopAllServers() for lspserver in LSPServers diff --git a/autoload/lsp/lspserver.vim b/autoload/lsp/lspserver.vim index 4366d73..4ae4019 100644 --- a/autoload/lsp/lspserver.vim +++ b/autoload/lsp/lspserver.vim @@ -543,7 +543,8 @@ def TextdocDidOpen(lspserver: dict, bnr: number, ftype: string): void textDocument: { uri: util.LspBufnrToUri(bnr), languageId: ftype, - version: 1, + # Use Vim 'changedtick' as the LSP document version number + version: bnr->getbufvar('changedtick'), text: bnr->getbufline(1, '$')->join("\n") .. "\n" } } @@ -570,7 +571,7 @@ def TextdocDidChange(lspserver: dict, bnr: number, start: number, # Notification: 'textDocument/didChange' # Params: DidChangeTextDocumentParams - var changeset: list> + # var changeset: list> ##### FIXME: Sending specific buffer changes to the LSP server doesn't ##### work properly as the computed line range numbers is not correct. @@ -608,14 +609,15 @@ def TextdocDidChange(lspserver: dict, bnr: number, start: number, # changeset->add({'range': range, 'text': lines}) # endfor - changeset->add({text: bnr->getbufline(1, '$')->join("\n") .. "\n"}) var params = { textDocument: { uri: util.LspBufnrToUri(bnr), # Use Vim 'changedtick' as the LSP document version number version: bnr->getbufvar('changedtick') }, - contentChanges: changeset + contentChanges: [ + {text: bnr->getbufline(1, '$')->join("\n") .. "\n"} + ] } lspserver.sendNotification('textDocument/didChange', params) enddef diff --git a/plugin/lsp.vim b/plugin/lsp.vim index 2de7df5..382ae49 100644 --- a/plugin/lsp.vim +++ b/plugin/lsp.vim @@ -49,6 +49,7 @@ augroup LSPAutoCmds # Note that when BufWipeOut is invoked, the current buffer may be different # from the buffer getting wiped out. autocmd BufWipeOut * lsp.RemoveFile(expand('')->str2nr()) + autocmd BufWinEnter * lsp.BufferLoadedInWin(expand('')->str2nr()) augroup END # TODO: Is it needed to shutdown all the LSP servers when exiting Vim? diff --git a/test/clangd_tests.vim b/test/clangd_tests.vim index 68d074b..5ad93b7 100644 --- a/test/clangd_tests.vim +++ b/test/clangd_tests.vim @@ -1548,6 +1548,31 @@ def g:Test_InlayHints() :%bw! enddef +# Test for reloading a modified buffer with diags +def g:Test_ReloadBufferWithDiags() + var lines: list =<< trim END + void ReloadBufferFunc1(void) + { + int a: + } + END + writefile(lines, 'Xreloadbuffer.c') + :silent! edit Xreloadbuffer.c + g:WaitForServerFileLoad(1) + var signs = sign_getplaced('%', {group: '*'})[0].signs + assert_equal(3, signs[0].lnum) + append(0, ['', '']) + signs = sign_getplaced('%', {group: '*'})[0].signs + assert_equal(5, signs[0].lnum) + :edit! + sleep 200m + signs = sign_getplaced('%', {group: '*'})[0].signs + assert_equal(3, signs[0].lnum) + + :%bw! + delete('Xreloadbuffer.c') +enddef + # Test for the :LspServer command. def g:Test_LspServer() new a.raku