endif
enddef
-# Process a 'shutdown' reply from the LSP server.
-def ProcessShutdownReply(lspserver: dict<any>, req: dict<any>, reply: dict<any>): void
- return
-enddef
-
# process the 'textDocument/signatureHelp' reply from the LSP server
# Result: SignatureHelp | null
def ProcessSignaturehelpReply(lspserver: dict<any>, req: dict<any>, reply: dict<any>): void
symbols->copy()->mapnew('v:val.name'))
enddef
-# process the 'textDocument/prepareCallHierarchy' reply from the LSP server
-# Result: CallHierarchyItem[] | null
-def ProcessPrepareCallHierarchy(lspserver: dict<any>, req: dict<any>, reply: dict<any>)
- if reply.result->empty()
- if lspserver.callHierarchyType == 'incoming'
- util.WarnMsg('No incoming calls')
- else
- util.WarnMsg('No outgoing calls')
- endif
- return
- endif
-
- var choice: number = 1
- if reply.result->len() > 1
- var items: list<string> = ['Select a Call Hierarchy Item:']
- for i in range(reply.result->len())
- items->add(printf("%d. %s", i + 1, reply.result[i].name))
- endfor
- choice = inputlist(items)
- if choice < 1 || choice > items->len()
- return
- endif
- endif
-
- if lspserver.callHierarchyType == 'incoming'
- g:LspGetIncomingCalls(reply.result[choice - 1])
- else
- g:LspGetOutgoingCalls(reply.result[choice - 1])
- endif
-enddef
-
-# process the 'callHierarchy/incomingCalls' reply from the LSP server
-# Result: CallHierarchyIncomingCall[] | null
-def ProcessIncomingCalls(lspserver: dict<any>, req: dict<any>, reply: dict<any>)
- if reply.result->empty()
- return
- endif
-
- callhier.IncomingCalls(reply.result)
-enddef
-
-# process the 'callHierarchy/outgoingCalls' reply from the LSP server
-# Result: CallHierarchyOutgoingCall[] | null
-def ProcessOutgoingCalls(lspserver: dict<any>, req: dict<any>, reply: dict<any>)
- if reply.result->empty()
- return
- endif
-
- callhier.OutgoingCalls(reply.result)
-enddef
-
# Process various reply messages from the LSP server
export def ProcessReply(lspserver: dict<any>, req: dict<any>, reply: dict<any>): void
var lsp_reply_handlers: dict<func> =
{
'initialize': ProcessInitializeReply,
- 'shutdown': ProcessShutdownReply,
'textDocument/signatureHelp': ProcessSignaturehelpReply,
'textDocument/completion': ProcessCompletionReply,
'textDocument/hover': ProcessHoverReply,
'textDocument/foldingRange': ProcessFoldingRangeReply,
'workspace/executeCommand': ProcessWorkspaceExecuteReply,
'workspace/symbol': ProcessWorkspaceSymbolReply,
- 'textDocument/prepareCallHierarchy': ProcessPrepareCallHierarchy,
- 'callHierarchy/incomingCalls': ProcessIncomingCalls,
- 'callHierarchy/outgoingCalls': ProcessOutgoingCalls
}
if lsp_reply_handlers->has_key(req.method)
import './selection.vim'
import './symbol.vim'
import './textedit.vim'
+import './callhierarchy.vim' as callhier
# LSP server standard output handler
def Output_cb(lspserver: dict<any>, chan: channel, msg: any): void
enddef
# Request: "textDocument/prepareCallHierarchy"
-# Param: CallHierarchyPrepareParams
-def PrepareCallHierarchy(lspserver: dict<any>, fname: string)
- # Check whether LSP server supports call hierarchy
- if !lspserver.caps->has_key('callHierarchyProvider')
- || !lspserver.caps.callHierarchyProvider
- util.ErrMsg("Error: LSP server does not support call hierarchy")
- return
+def PrepareCallHierarchy(lspserver: dict<any>): dict<any>
+ # interface CallHierarchyPrepareParams
+ # interface TextDocumentPositionParams
+ var param: dict<any>
+ param = GetLspTextDocPosition()
+ var reply = lspserver.rpc('textDocument/prepareCallHierarchy', param)
+ if reply->empty() || reply.result->empty()
+ return {}
endif
- var req = lspserver.createRequest('textDocument/prepareCallHierarchy')
+ # Result: CallHierarchyItem[] | null
+ var choice: number = 1
+ if reply.result->len() > 1
+ var items: list<string> = ['Select a Call Hierarchy Item:']
+ for i in range(reply.result->len())
+ items->add(printf("%d. %s", i + 1, reply.result[i].name))
+ endfor
+ choice = inputlist(items)
+ if choice < 1 || choice > items->len()
+ return {}
+ endif
+ endif
- # interface CallHierarchyPrepareParams
- # interface TextDocumentPositionParams
- req.params->extend(GetLspTextDocPosition())
- lspserver.sendMessage(req)
+ return reply.result[choice - 1]
enddef
# Request: "callHierarchy/incomingCalls"
-# Param: CallHierarchyItem
-def IncomingCalls(lspserver: dict<any>, hierItem: dict<any>)
+def IncomingCalls(lspserver: dict<any>, fname: string)
# Check whether LSP server supports call hierarchy
if !lspserver.caps->has_key('callHierarchyProvider')
|| !lspserver.caps.callHierarchyProvider
return
endif
- var req = lspserver.createRequest('callHierarchy/incomingCalls')
+ var reply = PrepareCallHierarchy(lspserver)
+ if reply->empty()
+ util.WarnMsg('No incoming calls')
+ return
+ endif
- # interface CallHierarchyIncomingCallsParams
- # interface CallHierarchyItem
- req.params->extend({item: hierItem})
- lspserver.sendMessage(req)
- if exists('g:LSPTest') && g:LSPTest
- # When running LSP tests, make this a synchronous call
- lspserver.waitForResponse(req)
+ # Request: "callHierarchy/incomingCalls"
+ # Param: CallHierarchyIncomingCallsParams
+ var param = {}
+ param.item = reply
+ reply = lspserver.rpc('callHierarchy/incomingCalls', param)
+ if reply->empty() || reply.result->empty()
+ util.WarnMsg('No incoming calls')
+ return
endif
+
+ callhier.IncomingCalls(reply.result)
enddef
# Request: "callHierarchy/outgoingCalls"
-# Param: CallHierarchyItem
-def OutgoingCalls(lspserver: dict<any>, hierItem: dict<any>)
+def OutgoingCalls(lspserver: dict<any>, fname: string)
# Check whether LSP server supports call hierarchy
if !lspserver.caps->has_key('callHierarchyProvider')
|| !lspserver.caps.callHierarchyProvider
return
endif
- var req = lspserver.createRequest('callHierarchy/outgoingCalls')
+ var reply = PrepareCallHierarchy(lspserver)
+ if reply->empty()
+ util.WarnMsg('No outgoing calls')
+ return
+ endif
- # interface CallHierarchyOutgoingCallsParams
- # interface CallHierarchyItem
- req.params->extend({item: hierItem})
- lspserver.sendMessage(req)
- if exists('g:LSPTest') && g:LSPTest
- # When running LSP tests, make this a synchronous call
- lspserver.waitForResponse(req)
+ # Request: "callHierarchy/outgoingCalls"
+ # Param: CallHierarchyOutgoingCallsParams
+ var param = {}
+ param.item = reply
+ reply = lspserver.rpc('callHierarchy/outgoingCalls', param)
+ if reply->empty() || reply.result->empty()
+ util.WarnMsg('No outgoing calls')
+ return
endif
+
+ callhier.OutgoingCalls(reply.result)
enddef
# Request: "textDocument/rename"
docHighlight: function(DocHighlight, [lspserver]),
getDocSymbols: function(GetDocSymbols, [lspserver]),
textDocFormat: function(TextDocFormat, [lspserver]),
- prepareCallHierarchy: function(PrepareCallHierarchy, [lspserver]),
incomingCalls: function(IncomingCalls, [lspserver]),
outgoingCalls: function(OutgoingCalls, [lspserver]),
renameSymbol: function(RenameSymbol, [lspserver]),