From f6abdff3c53124f1b2970dc0b3d706c49dd521d1 Mon Sep 17 00:00:00 2001 From: Andreas Louv Date: Tue, 11 Apr 2023 16:40:02 +0200 Subject: [PATCH] Add support for having multiple servers registered for the same buffer --- autoload/lsp/buffer.vim | 54 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/autoload/lsp/buffer.vim b/autoload/lsp/buffer.vim index 207c538..aa41dfd 100644 --- a/autoload/lsp/buffer.vim +++ b/autoload/lsp/buffer.vim @@ -5,20 +5,54 @@ vim9script import './util.vim' # Buffer number to LSP server map -var bufnrToServer: dict> = {} +var bufnrToServers: dict>> = {} export def BufLspServerSet(bnr: number, lspserver: dict) - bufnrToServer[bnr] = lspserver + if !bufnrToServers->has_key(bnr) + bufnrToServers[bnr] = [] + endif + + bufnrToServers[bnr]->add(lspserver) enddef -export def BufLspServerRemove(bnr: number) - bufnrToServer->remove(bnr) +export def BufLspServerRemove(bnr: number, lspserver: dict) + if !bufnrToServers->has_key(bnr) + return + endif + + var servers: list> = bufnrToServers[bnr] + servers = servers->filter((key, srv) => srv.id != lspserver.id) + + if servers->empty() + bufnrToServers->remove(bnr) + else + bufnrToServers[bnr] = servers + endif enddef # Returns the LSP server for the buffer 'bnr'. Returns an empty dict if the # server is not found. export def BufLspServerGet(bnr: number): dict - return bufnrToServer->get(bnr, {}) + if !bufnrToServers->has_key(bnr) + return {} + endif + + if bufnrToServers[bnr]->len() == 0 + return {} + endif + + # TODO implement logic to compute which server to return + return bufnrToServers[bnr][0] +enddef + +# Returns the LSP servers for the buffer 'bnr'. Returns an empty list if the +# servers are not found. +export def BufLspServersGet(bnr: number): list> + if !bufnrToServers->has_key(bnr) + return [] + endif + + return bufnrToServers[bnr] enddef # Returns the LSP server for the current buffer. Returns an empty dict if the @@ -27,8 +61,16 @@ export def CurbufGetServer(): dict return BufLspServerGet(bufnr()) enddef +# Returns the LSP servers for the current buffer. Returns an empty list if the +# servers are not found. +export def CurbufGetServers(): list> + return BufLspServersGet(bufnr()) +enddef + export def BufHasLspServer(bnr: number): bool - return bufnrToServer->has_key(bnr) + var lspserver = BufLspServerGet(bnr) + + return !lspserver->empty() enddef # Returns the LSP server for the current buffer if it is running and is ready. -- 2.48.1