autoload/lsp/buffer.vim | 11 +++++++++++ autoload/lsp/lsp.vim | 18 ++++++++++++++++++ autoload/lsp/lspserver.vim | 24 ++++++++++++++++++++++++ diff --git a/autoload/lsp/buffer.vim b/autoload/lsp/buffer.vim index 5a07654879473c59468301b3e58915f7579fd5ec..f48c3b1c5d83cf4f6759f28bffe0c3a1c2f26013 100644 --- a/autoload/lsp/buffer.vim +++ b/autoload/lsp/buffer.vim @@ -191,4 +191,15 @@ return lspserver enddef +export def CurbufGetServerByName(name: string): dict + var lspservers: list> = CurbufGetServers() + + for lspserver in lspservers + if lspserver.name == name + return lspserver + endif + endfor + return {} +enddef + # vim: tabstop=8 shiftwidth=2 softtabstop=2 diff --git a/autoload/lsp/lsp.vim b/autoload/lsp/lsp.vim index 1ed7b8d2541b0f3ca6efbc7381b47fc9bc399448..69029f2949de2cce69bd48438b0d92d669816903 100644 --- a/autoload/lsp/lsp.vim +++ b/autoload/lsp/lsp.vim @@ -832,6 +832,24 @@ lspserver.showReferences(peek) enddef +# send custom locations request +def g:LspFindLocations(server_name: string, peek: bool, method: string, args: dict = {}) + var lspserver: dict = buf.CurbufGetServerByName(server_name) + if lspserver->empty() + return + endif + if !lspserver.running + util.ErrMsg($'Language server "{server_name}" is not running') + return + endif + if !lspserver.ready + util.ErrMsg($'Language server "{server_name}" is not ready') + return + endif + + lspserver.findLocations(peek, method, args) +enddef + # highlight all the places where a symbol is referenced def g:LspDocHighlight(bnr: number = bufnr(), cmdmods: string = '') var lspserver: dict = buf.CurbufGetServerChecked('documentHighlight') diff --git a/autoload/lsp/lspserver.vim b/autoload/lsp/lspserver.vim index 1d4b0ed729e48a4a53cb6a73fc839aade79f3858..11e8d67ce6dfef3d1a003c0375cb6f70087e32a4 100644 --- a/autoload/lsp/lspserver.vim +++ b/autoload/lsp/lspserver.vim @@ -1006,6 +1006,29 @@ symbol.ShowLocations(lspserver, reply.result, peek, 'Symbol References') enddef +# send custom locations request +def FindLocations(lspserver: dict, peek: bool, method: string, args: dict): void + var param: dict + param = lspserver.getTextDocPosition(true)->extend(args) + var reply = lspserver.rpc(method, param) + + # Result: Location[] | null + if reply->empty() || reply.result->empty() + util.WarnMsg('No references found') + return + endif + + if lspserver.needOffsetEncoding + # Decode the position encoding in all the reference locations + reply.result->map((_, loc) => { + lspserver.decodeLocation(loc) + return loc + }) + endif + + symbol.ShowLocations(lspserver, reply.result, peek, 'Symbol References') +enddef + # process the 'textDocument/documentHighlight' reply from the LSP server # Result: DocumentHighlight[] | null def DocHighlightReply(lspserver: dict, docHighlightReply: any, @@ -1948,6 +1971,7 @@ showSignature: function(ShowSignature, [lspserver]), didSaveFile: function(DidSaveFile, [lspserver]), hover: function(ShowHoverInfo, [lspserver]), showReferences: function(ShowReferences, [lspserver]), + findLocations: function(FindLocations, [lspserver]), docHighlight: function(DocHighlight, [lspserver]), getDocSymbols: function(GetDocSymbols, [lspserver]), textDocFormat: function(TextDocFormat, [lspserver]),