# Update the signs placed in the buffer for this file
def ProcessNewDiags(lspserver: dict<any>, bnr: number)
if opt.lspOptions.autoPopulateDiags
- ShowAllDiags(lspserver, false)
+ DiagsUpdateLocList(lspserver)
endif
if !opt.lspOptions.autoHighlightDiags
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<any>, 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<any>): 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<dict<any>> = []
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<any>): void
+ if !DiagsUpdateLocList(lspserver)
+ util.WarnMsg('No diagnostic messages found for ' .. @%)
+ return
+ endif
+
+ :lopen
enddef
# Show the diagnostic message for the current line
# 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<any>, isSync: bool = false): number
if lspserver.running
util.WarnMsg("LSP server for is already running")
# Param: InitializeParams
#
# If 'isSync' is true, then waits for the server to send the initialize
-# reponse message.
+# response message.
def InitServer(lspserver: dict<any>, isSync: bool = false)
var req = lspserver.createRequest('initialize')
lspserver.sendMessage(req)
if isSync
- lspserver.waitForReponse(req)
+ lspserver.waitForResponse(req)
endif
enddef
def ShutdownServer(lspserver: dict<any>): void
var req = lspserver.createRequest('shutdown')
lspserver.sendMessage(req)
- lspserver.waitForReponse(req)
+ lspserver.waitForResponse(req)
enddef
# Send a 'exit' notification to the LSP server
# Wait for a response message from the LSP server for the request "req"
# Waits for a maximum of 5 seconds
-def WaitForReponse(lspserver: dict<any>, req: dict<any>)
+def WaitForResponse(lspserver: dict<any>, req: dict<any>)
var maxCount: number = 2500
var key: string = req.id->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
req.params->extend(GetLspTextDocPosition())
lspserver.sendMessage(req)
- lspserver.waitForReponse(req)
+ lspserver.waitForResponse(req)
enddef
# Request: "textDocument/switchSourceHeader"
req.params->extend({uri: util.LspFileToUri(@%)})
lspserver.sendMessage(req)
- lspserver.waitForReponse(req)
+ lspserver.waitForResponse(req)
enddef
# Request: "textDocument/declaration"
lspserver.sendMessage(req)
- lspserver.waitForReponse(req)
+ lspserver.waitForResponse(req)
enddef
# Request: "textDocument/typeDefinition"
lspserver.sendMessage(req)
- lspserver.waitForReponse(req)
+ lspserver.waitForResponse(req)
enddef
# Request: "textDocument/implementation"
lspserver.sendMessage(req)
- lspserver.waitForReponse(req)
+ lspserver.waitForResponse(req)
enddef
# get symbol signature help.
if exists('g:LSPTest') && g:LSPTest
# When running LSP tests, make this a synchronous call
- lspserver.waitForReponse(req)
+ lspserver.waitForResponse(req)
endif
enddef
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
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
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
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
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
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
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
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
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
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
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
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
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]),