From 8ce31b25ab1541f171380d00dbc673b34d5eda0a Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Fri, 11 Dec 2020 20:56:45 -0800 Subject: [PATCH] Add support for diagnostics --- autoload/lsp.vim | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/autoload/lsp.vim b/autoload/lsp.vim index aa784c4..4ef0b16 100644 --- a/autoload/lsp.vim +++ b/autoload/lsp.vim @@ -17,7 +17,7 @@ def lsp#processInitializeReply(ftype: string, reply: dict): void if caps->has_key('signatureHelpProvider') var triggers = caps.signatureHelpProvider.triggerCharacters for ch in triggers - exe 'inoremap ' .. ch .. ' ' .. ch .. "=lsp#show_signature()" + exe 'inoremap ' .. ch .. ' ' .. ch .. "=lsp#show_signature()" endfor endif enddef @@ -75,6 +75,8 @@ def lsp#process_reply(ftype: string, req: dict, reply: dict): void lsp#processDefDeclReply(reply) elseif req.method == 'textDocument/signatureHelp' lsp#process_signatureHelp_reply(reply) + else + echomsg "Error: Unsupported reply received from LSP server: " .. string(reply) endif enddef @@ -118,6 +120,13 @@ def lsp#process_server_msg(ftype: string): void else lsp#process_reply(ftype, req, reply) endif + else + if reply.method == 'textDocument/publishDiagnostics' + # Todo: process the diagnostics from the LSP server + lsp_servers[ftype].diags = reply.params.diagnostics + else + echomsg 'Error: Unsupported notification received from LSP server ' .. string(reply) + endif endif lsp_servers[ftype].data = lsp_servers[ftype].data[idx + len :] @@ -198,6 +207,7 @@ def lsp#start_server(ftype: string): number var opts = {'in_mode': 'raw', 'out_mode': 'raw', 'err_mode': 'raw', + 'noblock': 1, 'out_cb': function('lsp#output_cb', [ftype]), 'err_cb': function('lsp#error_cb', [ftype]), 'exit_cb': function('lsp#exit_cb', [ftype])} @@ -215,6 +225,9 @@ def lsp#start_server(ftype: string): number return 1 endif + # wait for the LSP server to start + sleep 10m + lsp_servers[ftype].job = job lsp_servers[ftype].running = v:true @@ -397,7 +410,7 @@ def lsp#bufchange_listener(bnum: number, start: number, end: number, added: numb enddef def lsp#add_file(fname: string, ftype: string): void - if fname == '' || ftype == '' || !lsp_servers->has_key(ftype) + if fname == '' || ftype == '' || !filereadable(fname) || !lsp_servers->has_key(ftype) return endif if !lsp_servers[ftype].running @@ -416,9 +429,6 @@ def lsp#remove_file(fname: string, ftype: string): void if fname == '' || ftype == '' || !lsp_servers->has_key(ftype) return endif - if !lsp_servers[ftype].running - lsp#start_server(ftype) - endif lsp#textdoc_didclose(fname, ftype) enddef @@ -439,7 +449,8 @@ def lsp#add_server(ftype: string, serverpath: string, args: list) 'data': '', 'nextID': 1, 'caps': {}, - 'requests': {} # outstanding LSP requests + 'requests': {}, # outstanding LSP requests + 'diags': {} } lsp_servers->extend({[ftype]: sinfo}) enddef @@ -448,4 +459,14 @@ def lsp#show_servers() echomsg lsp_servers enddef +def lsp#showDiagnostics(ftype: string): void + var msgs: list = [] + echomsg lsp_servers[ftype].diags + for diag in lsp_servers[ftype].diags + diag.message = diag.message->substitute("\n\\+", "\n", 'g') + msgs->extend(split(diag.message, "\n")) + endfor + setqflist([], ' ', {'lines': msgs}) +enddef + # vim: shiftwidth=2 sts=2 expandtab -- 2.48.1