# 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)
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<dict<any>> = 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
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"
}
}
# Notification: 'textDocument/didChange'
# Params: DidChangeTextDocumentParams
- var changeset: list<dict<any>>
+ # var changeset: list<dict<any>>
##### FIXME: Sending specific buffer changes to the LSP server doesn't
##### work properly as the computed line range numbers is not correct.
# 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
# Note that when BufWipeOut is invoked, the current buffer may be different
# from the buffer getting wiped out.
autocmd BufWipeOut * lsp.RemoveFile(expand('<abuf>')->str2nr())
+ autocmd BufWinEnter * lsp.BufferLoadedInWin(expand('<abuf>')->str2nr())
augroup END
# TODO: Is it needed to shutdown all the LSP servers when exiting Vim?
:%bw!
enddef
+# Test for reloading a modified buffer with diags
+def g:Test_ReloadBufferWithDiags()
+ var lines: list<string> =<< 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