aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/buf.lua
diff options
context:
space:
mode:
authorcbarrete <62146989+cbarrete@users.noreply.github.com>2020-07-18 21:10:09 +0200
committerGitHub <noreply@github.com>2020-07-18 15:10:09 -0400
commit08efa7037e05ce229150d17db11b1b1c2419631f (patch)
tree0064d34f56ed96f82094970d60870d02773349cc /runtime/lua/vim/lsp/buf.lua
parenta02a267f8ad4b6d8b9038d2c7d9b85f03e734814 (diff)
downloadrneovim-08efa7037e05ce229150d17db11b1b1c2419631f.tar.gz
rneovim-08efa7037e05ce229150d17db11b1b1c2419631f.tar.bz2
rneovim-08efa7037e05ce229150d17db11b1b1c2419631f.zip
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 <>
Diffstat (limited to 'runtime/lua/vim/lsp/buf.lua')
-rw-r--r--runtime/lua/vim/lsp/buf.lua32
1 files changed, 32 insertions, 0 deletions
diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua
index 839e00c67d..476bb3ba6f 100644
--- a/runtime/lua/vim/lsp/buf.lua
+++ b/runtime/lua/vim/lsp/buf.lua
@@ -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.
---