lsp: Add support for call hierarchies (#12556)

* LSP: Add support for call hierarchies

* LSP: Add support for call hierarchies

* LSP: Add support for call hierarchies

* LSP: Jump to call location

Jump to the call site instead of jumping to the definition of the
caller/callee.

* LSP: add tests for the call hierarchy callbacks

* Fix linting error

Co-authored-by: Cédric Barreteau <>
This commit is contained in:
cbarrete
2020-07-18 21:10:09 +02:00
committed by GitHub
parent a02a267f8a
commit 08efa7037e
6 changed files with 217 additions and 0 deletions

View File

@@ -143,6 +143,38 @@ function M.document_symbol()
request('textDocument/documentSymbol', params)
end
local function pick_call_hierarchy_item(call_hierarchy_items)
if not call_hierarchy_items then return end
if #call_hierarchy_items == 1 then
return call_hierarchy_items[1]
end
local items = {}
for i, item in ipairs(call_hierarchy_items) do
local entry = item.detail or item.name
table.insert(items, string.format("%d. %s", i, entry))
end
local choice = vim.fn.inputlist(items)
if choice < 1 or choice > #items then
return
end
return choice
end
function M.incoming_calls()
local params = util.make_position_params()
request('textDocument/prepareCallHierarchy', params, function(_, _, result)
local call_hierarchy_item = pick_call_hierarchy_item(result)
vim.lsp.buf_request(0, 'callHierarchy/incomingCalls', { item = call_hierarchy_item })
end)
end
function M.outgoing_calls()
local params = util.make_position_params()
request('textDocument/prepareCallHierarchy', params, function(_, _, result)
local call_hierarchy_item = pick_call_hierarchy_item(result)
vim.lsp.buf_request(0, 'callHierarchy/outgoingCalls', { item = call_hierarchy_item })
end)
end
--- Lists all symbols in the current workspace in the quickfix window.
---