From: Yegappan Lakshmanan Date: Thu, 31 Mar 2022 05:33:45 +0000 (-0700) Subject: Refresh the location list window with the latest diagnostics messages X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=875c7d859f2e0d631b7a3c5f232e108869194f70;p=vim-lsp.git Refresh the location list window with the latest diagnostics messages --- diff --git a/autoload/lsp/diag.vim b/autoload/lsp/diag.vim index c9423ef..cba1364 100644 --- a/autoload/lsp/diag.vim +++ b/autoload/lsp/diag.vim @@ -45,7 +45,7 @@ enddef # Update the signs placed in the buffer for this file def ProcessNewDiags(lspserver: dict, bnr: number) if opt.lspOptions.autoPopulateDiags - ShowAllDiags(lspserver, false) + DiagsUpdateLocList(lspserver) endif if !opt.lspOptions.autoHighlightDiags @@ -154,18 +154,26 @@ def DiagSevToQfType(severity: number): string return typeMap[severity - 1] enddef -# Display the diagnostic messages from the LSP server for the current buffer -# in a location list -export def ShowAllDiags(lspserver: dict, open = true): void +# Update the location list window for the current window with the diagnostic +# messages. +# Returns true if diagnostics is not empty and false if it is empty. +def DiagsUpdateLocList(lspserver: dict): bool var fname: string = expand('%:p') if fname == '' - return + return false endif var bnr: number = bufnr() + var LspQfId: number = 0 + if exists('b:LspQfId') && getloclist(0, {id: b:LspQfId}).id == b:LspQfId + LspQfId = b:LspQfId + endif + if !lspserver.diagsMap->has_key(bnr) || lspserver.diagsMap[bnr]->empty() - util.WarnMsg('No diagnostic messages found for ' .. fname) - return + if LspQfId != 0 + setloclist(0, [], 'r', {id: LspQfId, items: []}) + endif + return false endif var qflist: list> = [] @@ -173,17 +181,34 @@ export def ShowAllDiags(lspserver: dict, open = true): void for [lnum, diag] in lspserver.diagsMap[bnr]->items() text = diag.message->substitute("\n\\+", "\n", 'g') - qflist->add({'filename': fname, - 'lnum': diag.range.start.line + 1, - 'col': util.GetLineByteFromPos(bnr, diag.range.start) + 1, - 'text': text, - 'type': DiagSevToQfType(diag.severity)}) + qflist->add({filename: fname, + lnum: diag.range.start.line + 1, + col: util.GetLineByteFromPos(bnr, diag.range.start) + 1, + text: text, + type: DiagSevToQfType(diag.severity)}) endfor - setloclist(0, [], ' ', {'title': 'Language Server Diagnostics', - 'items': qflist}) - if open - :lopen + + var op: string = ' ' + var props = {title: 'Language Server Diagnostics', items: qflist} + if LspQfId != 0 + op = 'r' + props.id = LspQfId endif + setloclist(0, [], op, props) + b:LspQfId = getloclist(0, {id: 0}).id + + return true +enddef + +# Display the diagnostic messages from the LSP server for the current buffer +# in a location list +export def ShowAllDiags(lspserver: dict): void + if !DiagsUpdateLocList(lspserver) + util.WarnMsg('No diagnostic messages found for ' .. @%) + return + endif + + :lopen enddef # Show the diagnostic message for the current line diff --git a/autoload/lsp/lspserver.vim b/autoload/lsp/lspserver.vim index ae7a470..7559fe4 100644 --- a/autoload/lsp/lspserver.vim +++ b/autoload/lsp/lspserver.vim @@ -78,7 +78,7 @@ enddef # Start a LSP server # # If 'isSync' is true, then waits for the server to send the initialize -# reponse message. +# response message. def StartServer(lspserver: dict, isSync: bool = false): number if lspserver.running util.WarnMsg("LSP server for is already running") @@ -126,7 +126,7 @@ enddef # Param: InitializeParams # # If 'isSync' is true, then waits for the server to send the initialize -# reponse message. +# response message. def InitServer(lspserver: dict, isSync: bool = false) var req = lspserver.createRequest('initialize') @@ -177,7 +177,7 @@ def InitServer(lspserver: dict, isSync: bool = false) lspserver.sendMessage(req) if isSync - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -193,7 +193,7 @@ enddef def ShutdownServer(lspserver: dict): void var req = lspserver.createRequest('shutdown') lspserver.sendMessage(req) - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) enddef # Send a 'exit' notification to the LSP server @@ -311,7 +311,7 @@ enddef # Wait for a response message from the LSP server for the request "req" # Waits for a maximum of 5 seconds -def WaitForReponse(lspserver: dict, req: dict) +def WaitForResponse(lspserver: dict, req: dict) var maxCount: number = 2500 var key: string = req.id->string() @@ -455,7 +455,7 @@ def GetCompletion(lspserver: dict, triggerKind_arg: number): void lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -479,7 +479,7 @@ def GotoDefinition(lspserver: dict, peek: bool) req.params->extend(GetLspTextDocPosition()) lspserver.sendMessage(req) - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) enddef # Request: "textDocument/switchSourceHeader" @@ -490,7 +490,7 @@ def SwitchSourceHeader(lspserver: dict) req.params->extend({uri: util.LspFileToUri(@%)}) lspserver.sendMessage(req) - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) enddef # Request: "textDocument/declaration" @@ -515,7 +515,7 @@ def GotoDeclaration(lspserver: dict, peek: bool): void lspserver.sendMessage(req) - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) enddef # Request: "textDocument/typeDefinition" @@ -540,7 +540,7 @@ def GotoTypeDef(lspserver: dict, peek: bool): void lspserver.sendMessage(req) - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) enddef # Request: "textDocument/implementation" @@ -565,7 +565,7 @@ def GotoImplementation(lspserver: dict, peek: bool): void lspserver.sendMessage(req) - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) enddef # get symbol signature help. @@ -587,7 +587,7 @@ def ShowSignature(lspserver: dict): void if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -624,7 +624,7 @@ def ShowHoverInfo(lspserver: dict): void lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -648,7 +648,7 @@ def ShowReferences(lspserver: dict, peek: bool): void lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -669,7 +669,7 @@ def DocHighlight(lspserver: dict): void lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -690,7 +690,7 @@ def GetDocSymbols(lspserver: dict, fname: string): void lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -736,7 +736,7 @@ def TextDocFormat(lspserver: dict, fname: string, rangeFormat: bool, lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -776,7 +776,7 @@ def IncomingCalls(lspserver: dict, hierItem: dict) lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -798,7 +798,7 @@ def OutgoingCalls(lspserver: dict, hierItem: dict) lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -820,7 +820,7 @@ def RenameSymbol(lspserver: dict, newName: string) lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -854,7 +854,7 @@ def CodeAction(lspserver: dict, fname_arg: string) lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -949,7 +949,7 @@ def SelectionRange(lspserver: dict, fname: string) req.params->extend({textDocument: {uri: util.LspFileToUri(fname)}, positions: [GetLspPosition()]}) lspserver.sendMessage(req) - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) enddef # Expand the previous selection or start a new one @@ -994,7 +994,7 @@ def FoldRange(lspserver: dict, fname: string) lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -1007,7 +1007,7 @@ def ExecuteCommand(lspserver: dict, cmd: dict) lspserver.sendMessage(req) if exists('g:LSPTest') && g:LSPTest # When running LSP tests, make this a synchronous call - lspserver.waitForReponse(req) + lspserver.waitForResponse(req) endif enddef @@ -1055,7 +1055,7 @@ export def NewLspServer(path: string, args: list): dict createNotification: function(CreateNotification, [lspserver]), sendResponse: function(SendResponse, [lspserver]), sendMessage: function(SendMessage, [lspserver]), - waitForReponse: function(WaitForReponse, [lspserver]), + waitForResponse: function(WaitForResponse, [lspserver]), processReply: function(handlers.ProcessReply, [lspserver]), processNotif: function(handlers.ProcessNotif, [lspserver]), processRequest: function(handlers.ProcessRequest, [lspserver]),