From 3faeb87a3eeeb1ad9eafc889b9e58dbcae02a630 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Wed, 30 Dec 2020 16:00:36 -0800 Subject: [PATCH] Refactor the code --- autoload/lsp.vim | 363 ++++++++++++++++++++++++++++------------------- 1 file changed, 215 insertions(+), 148 deletions(-) diff --git a/autoload/lsp.vim b/autoload/lsp.vim index bc3e1ee..c6f3eaf 100644 --- a/autoload/lsp.vim +++ b/autoload/lsp.vim @@ -1292,6 +1292,46 @@ def s:getLspTextDocPosition(): dict> 'position': s:getLspPosition()} enddef +def s:gotoDefinition(lspserver: dict): void + var req = lspserver.createRequest('textDocument/definition') + + # interface DefinitionParams + # interface TextDocumentPositionParams + req.params->extend(s:getLspTextDocPosition()) + + lspserver.sendMessage(req) +enddef + +def s:gotoDeclaration(lspserver: dict): void + var req = lspserver.createRequest('textDocument/declaration') + + # interface DeclarationParams + # interface TextDocumentPositionParams + req.params->extend(s:getLspTextDocPosition()) + + lspserver.sendMessage(req) +enddef + +def s:gotoTypeDef(lspserver: dict): void + var req = lspserver.createRequest('textDocument/typeDefinition') + + # interface TypeDefinitionParams + # interface TextDocumentPositionParams + req.params->extend(s:getLspTextDocPosition()) + + lspserver.sendMessage(req) +enddef + +def s:gotoImplementation(lspserver: dict): void + var req = lspserver.createRequest('textDocument/implementation') + + # interface ImplementationParams + # interface TextDocumentPositionParams + req.params->extend(s:getLspTextDocPosition()) + + lspserver.sendMessage(req) +enddef + # Go to a definition using "textDocument/definition" LSP request def lsp#gotoDefinition() var ftype: string = &filetype @@ -1328,13 +1368,7 @@ def lsp#gotoDefinition() 'tagname': expand('')} ]}, 'a') - var req = lspserver.createRequest('textDocument/definition') - - # interface DefinitionParams - # interface TextDocumentPositionParams - req.params->extend(s:getLspTextDocPosition()) - - lspserver.sendMessage(req) + lspserver.gotoDefinition() enddef # Go to a declaration using "textDocument/declaration" LSP request @@ -1373,13 +1407,7 @@ def lsp#gotoDeclaration() 'tagname': expand('')} ]}, 'a') - var req = lspserver.createRequest('textDocument/declaration') - - # interface DeclarationParams - # interface TextDocumentPositionParams - req.params->extend(s:getLspTextDocPosition()) - - lspserver.sendMessage(req) + lspserver.gotoDeclaration() enddef # Go to a type definition using "textDocument/typeDefinition" LSP request @@ -1418,13 +1446,7 @@ def lsp#gotoTypedef() 'tagname': expand('')} ]}, 'a') - var req = lspserver.createRequest('textDocument/typeDefinition') - - # interface TypeDefinitionParams - # interface TextDocumentPositionParams - req.params->extend(s:getLspTextDocPosition()) - - lspserver.sendMessage(req) + lspserver.gotoTypeDef() enddef # Go to a implementation using "textDocument/implementation" LSP request @@ -1463,9 +1485,18 @@ def lsp#gotoImplementation() 'tagname': expand('')} ]}, 'a') - var req = lspserver.createRequest('textDocument/implementation') + lspserver.gotoImplementation() +enddef - # interface ImplementationParams +def s:showSignature(lspserver: dict): void + # Check whether LSP server supports signature help + if !lspserver.caps->has_key('signatureHelpProvider') + ErrMsg("Error: LSP server does not support signature help") + return + endif + + var req = lspserver.createRequest('textDocument/signatureHelp') + # interface SignatureHelpParams # interface TextDocumentPositionParams req.params->extend(s:getLspTextDocPosition()) @@ -1489,11 +1520,6 @@ def lsp#showSignature(): string ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not running') return '' endif - # Check whether LSP server supports signature help - if !lspserver.caps->has_key('signatureHelpProvider') - ErrMsg("Error: LSP server does not support signature help") - return '' - endif var fname: string = @% if fname == '' @@ -1502,13 +1528,7 @@ def lsp#showSignature(): string # first send all the changes in the current buffer to the LSP server listener_flush() - - var req = lspserver.createRequest('textDocument/signatureHelp') - # interface SignatureHelpParams - # interface TextDocumentPositionParams - req.params->extend(s:getLspTextDocPosition()) - - lspserver.sendMessage(req) + lspserver.showSignature() return '' enddef @@ -1573,6 +1593,13 @@ def lsp#bufchange_listener(bnr: number, start: number, end: number, added: numbe lspserver.sendMessage(notif) enddef +def s:didSaveFile(lspserver: dict): void + var notif: dict = lspserver.createNotification('textDocument/didSave') + # interface: DidSaveTextDocumentParams + notif.params->extend({'textDocument': {'uri': LspFileToUri(bufname(bnr))}}) + lspserver.sendMessage(notif) +enddef + # A buffer is saved. Send the "textDocument/didSave" LSP notification def s:lspSavedFile() var bnr: number = str2nr(expand('')) @@ -1591,12 +1618,7 @@ def s:lspSavedFile() return endif - var notif: dict = lspserver.createNotification('textDocument/didSave') - - # interface: DidSaveTextDocumentParams - notif.params->extend({'textDocument': {'uri': LspFileToUri(bufname(bnr))}}) - - lspserver.sendMessage(notif) + lspserver.didSaveFile() enddef # A new buffer is opened. If LSP is supported for this buffer, then add it @@ -1730,7 +1752,21 @@ def lsp#addServer(serverList: list>) 'textdocDidOpen': function('s:textdocDidOpen', [lspserver]), 'textdocDidClose': function('s:textdocDidClose', [lspserver]), 'sendInitializedNotif': function('s:sendInitializedNotif', [lspserver]), - 'getCompletion': function('s:getCompletion', [lspserver]) + 'getCompletion': function('s:getCompletion', [lspserver]), + 'gotoDefinition': function('s:gotoDefinition', [lspserver]), + 'gotoDeclaration': function('s:gotoDeclaration', [lspserver]), + 'gotoTypeDef': function('s:gotoTypeDef', [lspserver]), + 'gotoImplementation': function('s:gotoImplementation', [lspserver]), + 'showSignature': function('s:showSignature', [lspserver]), + 'didSaveFile': function('s:didSaveFile', [lspserver]), + 'hover': function('s:hover', [lspserver]), + 'showReferences': function('s:showReferences', [lspserver]), + 'docHighlight': function('s:docHighlight', [lspserver]), + 'showDocSymbols': function('s:showDocSymbols', [lspserver]), + 'renameSymbol': function('s:renameSymbol', [lspserver]), + 'workspaceSymbols': function('s:workspaceSymbols', [lspserver]), + 'addWorkspaceFolder': function('s:addWorkspaceFolder', [lspserver]), + 'removeWorkspaceFolder': function('s:removeWorkspaceFolder', [lspserver]) }) if type(server.filetype) == v:t_string @@ -1877,6 +1913,20 @@ def lsp#completeFunc(findstart: number, base: string): any endif enddef +def s:hover(lspserver: dict): void + # Check whether LSP server supports getting hover information + if !lspserver.caps->has_key('hoverProvider') + || !lspserver.caps.hoverProvider + return + endif + + var req = lspserver.createRequest('textDocument/hover') + # interface HoverParams + # interface TextDocumentPositionParams + req.params->extend(s:getLspTextDocPosition()) + lspserver.sendMessage(req) +enddef + # Display the hover message from the LSP server for the current cursor # location def LspHover() @@ -1892,21 +1942,28 @@ def LspHover() if !lspserver.running return endif - # Check whether LSP server supports getting hover information - if !lspserver.caps->has_key('hoverProvider') - || !lspserver.caps.hoverProvider - return - endif var fname = @% if fname == '' return endif - var req = lspserver.createRequest('textDocument/hover') - # interface HoverParams + lspserver.hover() +enddef + +def s:showReferences(lspserver: dict): void + # Check whether LSP server supports getting reference information + if !lspserver.caps->has_key('referencesProvider') + || !lspserver.caps.referencesProvider + ErrMsg("Error: LSP server does not support showing references") + return + endif + + var req = lspserver.createRequest('textDocument/references') + # interface ReferenceParams # interface TextDocumentPositionParams req.params->extend(s:getLspTextDocPosition()) + req.params->extend({'context': {'includeDeclaration': v:true}}) lspserver.sendMessage(req) enddef @@ -1928,24 +1985,26 @@ def lsp#showReferences() return endif - # Check whether LSP server supports getting reference information - if !lspserver.caps->has_key('referencesProvider') - || !lspserver.caps.referencesProvider - ErrMsg("Error: LSP server does not support showing references") + var fname = @% + if fname == '' return endif - var fname = @% - if fname == '' + lspserver.showReferences() +enddef + +def s:docHighlight(lspserver: dict): void + # Check whether LSP server supports getting highlight information + if !lspserver.caps->has_key('documentHighlightProvider') + || !lspserver.caps.documentHighlightProvider + ErrMsg("Error: LSP server does not support document highlight") return endif - var req = lspserver.createRequest('textDocument/references') - # interface ReferenceParams + var req = lspserver.createRequest('textDocument/documentHighlight') + # interface DocumentHighlightParams # interface TextDocumentPositionParams req.params->extend(s:getLspTextDocPosition()) - req.params->extend({'context': {'includeDeclaration': v:true}}) - lspserver.sendMessage(req) enddef @@ -1966,24 +2025,12 @@ def lsp#docHighlight() return endif - # Check whether LSP server supports getting highlight information - if !lspserver.caps->has_key('documentHighlightProvider') - || !lspserver.caps.documentHighlightProvider - ErrMsg("Error: LSP server does not support document highlight") - return - endif - var fname = @% if fname == '' return endif - var req = lspserver.createRequest('textDocument/documentHighlight') - # interface DocumentHighlightParams - # interface TextDocumentPositionParams - req.params->extend(s:getLspTextDocPosition()) - - lspserver.sendMessage(req) + lspserver.docHighlight() enddef # clear the symbol reference highlight @@ -1993,6 +2040,21 @@ def lsp#docHighlightClear() prop_remove({'type': 'LspWriteRef', 'all': v:true}, 1, line('$')) enddef +def s:showDocSymbols(lspserver: dict, fname: string): void + # Check whether LSP server supports getting document symbol information + if !lspserver.caps->has_key('documentSymbolProvider') + || !lspserver.caps.documentSymbolProvider + ErrMsg("Error: LSP server does not support getting list of symbols") + return + endif + + var req = lspserver.createRequest('textDocument/documentSymbol') + # interface DocumentSymbolParams + # interface TextDocumentIdentifier + req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}}) + lspserver.sendMessage(req) +enddef + # open a window and display all the symbols in a file def lsp#showDocSymbols() var ftype = &filetype @@ -2010,24 +2072,12 @@ def lsp#showDocSymbols() return endif - # Check whether LSP server supports getting document symbol information - if !lspserver.caps->has_key('documentSymbolProvider') - || !lspserver.caps.documentSymbolProvider - ErrMsg("Error: LSP server does not support getting list of symbols") - return - endif - var fname = @% if fname == '' return endif - var req = lspserver.createRequest('textDocument/documentSymbol') - # interface DocumentSymbolParams - # interface TextDocumentIdentifier - req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}}) - - lspserver.sendMessage(req) + lspserver.showDocSymbols(fname) enddef # Format the entire file @@ -2136,6 +2186,22 @@ def lsp#outgoingCalls() :echomsg 'Error: Not implemented yet' enddef +def s:renameSymbol(lspserver: dict, newName: string) + # Check whether LSP server supports rename operation + if !lspserver.caps->has_key('renameProvider') + || !lspserver.caps.renameProvider + ErrMsg("Error: LSP server does not support rename operation") + return + endif + + var req = lspserver.createRequest('textDocument/rename') + # interface RenameParams + # interface TextDocumentPositionParams + req.params->extend(s:getLspTextDocPosition()) + req.params->extend({'newName': newName}) + lspserver.sendMessage(req) +enddef + # Rename a symbol # Uses LSP "textDocument/rename" request def lsp#rename() @@ -2154,13 +2220,6 @@ def lsp#rename() return endif - # Check whether LSP server supports rename operation - if !lspserver.caps->has_key('renameProvider') - || !lspserver.caps.renameProvider - ErrMsg("Error: LSP server does not support rename operation") - return - endif - var fname = @% if fname == '' return @@ -2171,13 +2230,7 @@ def lsp#rename() return endif - var req = lspserver.createRequest('textDocument/rename') - # interface RenameParams - # interface TextDocumentPositionParams - req.params->extend(s:getLspTextDocPosition()) - req.params->extend({'newName': newName}) - - lspserver.sendMessage(req) + lspserver.renameSymbol(newName) enddef # Perform a code action @@ -2229,6 +2282,19 @@ def lsp#codeAction() lspserver.sendMessage(req) enddef +def s:workspaceSymbols(lspserver: dict, sym: string) + # Check whether the LSP server supports listing workspace symbols + if !lspserver.caps->has_key('workspaceSymbolProvider') + || !lspserver.caps.workspaceSymbolProvider + ErrMsg("Error: LSP server does not support listing workspace symbols") + return + endif + + var req = lspserver.createRequest('workspace/symbol') + req.params->extend({'query': sym}) + lspserver.sendMessage(req) +enddef + # Perform a workspace wide symbol lookup # Uses LSP "workspace/symbol" request def lsp#showWorkspaceSymbols() @@ -2247,26 +2313,17 @@ def lsp#showWorkspaceSymbols() return endif - # Check whether the LSP server supports listing workspace symbols - if !lspserver.caps->has_key('workspaceSymbolProvider') - || !lspserver.caps.workspaceSymbolProvider - ErrMsg("Error: LSP server does not support listing workspace symbols") - return - endif - var fname = @% if fname == '' return endif - var req = lspserver.createRequest('workspace/symbol') var sym: string = input("Lookup symbol: ", expand('')) if sym == '' return endif - req.params->extend({'query': sym}) - lspserver.sendMessage(req) + lspserver.workspaceSymbols(sym) enddef # Display the list of workspace folders @@ -2289,6 +2346,53 @@ def lsp#listWorkspaceFolders() echomsg 'Workspace Folders: ' .. string(lspserver.workspaceFolders) enddef +def s:addWorkspaceFolder(lspserver: dict, dirName: string): void + if !lspserver.caps->has_key('workspace') + || !lspserver.caps.workspace->has_key('workspaceFolders') + || !lspserver.caps.workspace.workspaceFolders->has_key('supported') + || !lspserver.caps.workspace.workspaceFolders.supported + ErrMsg('Error: LSP server does not support workspace folders') + return + endif + + if lspserver.workspaceFolders->index(dirName) != -1 + ErrMsg('Error: ' .. dirName .. ' is already part of this workspace') + return + endif + + var notif: dict = + lspserver.createNotification('workspace/didChangeWorkspaceFolders') + # interface DidChangeWorkspaceFoldersParams + notif.params->extend({'event': {'added': [dirName], 'removed': []}}) + lspserver.sendMessage(notif) + + lspserver.workspaceFolders->add(dirName) +enddef + +def s:removeWorkspaceFolder(lspserver: dict, dirName: string): void + if !lspserver.caps->has_key('workspace') + || !lspserver.caps.workspace->has_key('workspaceFolders') + || !lspserver.caps.workspace.workspaceFolders->has_key('supported') + || !lspserver.caps.workspace.workspaceFolders.supported + ErrMsg('Error: LSP server does not support workspace folders') + return + endif + + var idx: number = lspserver.workspaceFolders->index(dirName) + if idx == -1 + ErrMsg('Error: ' .. dirName .. ' is not currently part of this workspace') + return + endif + + var notif: dict = + lspserver.createNotification('workspace/didChangeWorkspaceFolders') + # interface DidChangeWorkspaceFoldersParams + notif.params->extend({'event': {'added': [], 'removed': [dirName]}}) + lspserver.sendMessage(notif) + + lspserver.workspaceFolders->remove(idx) +enddef + # Add a workspace folder. Default is to use the current folder. def lsp#addWorkspaceFolder(dirArg: string) var ftype = &filetype @@ -2306,14 +2410,6 @@ def lsp#addWorkspaceFolder(dirArg: string) return endif - if !lspserver.caps->has_key('workspace') - || !lspserver.caps.workspace->has_key('workspaceFolders') - || !lspserver.caps.workspace.workspaceFolders->has_key('supported') - || !lspserver.caps.workspace.workspaceFolders.supported - ErrMsg('Error: LSP server does not support workspace folders') - return - endif - var dirName: string = dirArg if dirName == '' dirName = input("Add Workspace Folder: ", getcwd(), 'dir') @@ -2327,17 +2423,7 @@ def lsp#addWorkspaceFolder(dirArg: string) return endif - if lspserver.workspaceFolders->index(dirName) != -1 - ErrMsg('Error: ' .. dirName .. ' is already part of this workspace') - return - endif - - var notif: dict = lspserver.createNotification('workspace/didChangeWorkspaceFolders') - # interface DidChangeWorkspaceFoldersParams - notif.params->extend({'event': {'added': [dirName], 'removed': []}}) - lspserver.sendMessage(notif) - - lspserver.workspaceFolders->add(dirName) + lspserver.addWorkspaceFolder(dirName) enddef # Remove a workspace folder. Default is to use the current folder. @@ -2357,14 +2443,6 @@ def lsp#removeWorkspaceFolder(dirArg: string) return endif - if !lspserver.caps->has_key('workspace') - || !lspserver.caps.workspace->has_key('workspaceFolders') - || !lspserver.caps.workspace.workspaceFolders->has_key('supported') - || !lspserver.caps.workspace.workspaceFolders.supported - ErrMsg('Error: LSP server does not support workspace folders') - return - endif - var dirName: string = dirArg if dirName == '' dirName = input("Remove Workspace Folder: ", getcwd(), 'dir') @@ -2378,18 +2456,7 @@ def lsp#removeWorkspaceFolder(dirArg: string) return endif - var idx: number = lspserver.workspaceFolders->index(dirName) - if idx == -1 - ErrMsg('Error: ' .. dirName .. ' is not currently part of this workspace') - return - endif - - var notif: dict = lspserver.createNotification('workspace/didChangeWorkspaceFolders') - # interface DidChangeWorkspaceFoldersParams - notif.params->extend({'event': {'added': [], 'removed': [dirName]}}) - lspserver.sendMessage(notif) - - lspserver.workspaceFolders->remove(idx) + lspserver.removeWorkspaceFolder(dirName) enddef # vim: shiftwidth=2 softtabstop=2 -- 2.48.1