feat(treesitter): symbols & ignore symbols options (#2338)

* feat(treesitter): symbols & ignore symbols options

* renamed the function passed to utils.filter_symbols

---------

Co-authored-by: Maksym Klishevych <max@klishevy.ch>
This commit is contained in:
Maksym Klishevych
2023-03-22 15:49:55 +02:00
committed by GitHub
parent e504cf03c2
commit 942fe5faef
4 changed files with 48 additions and 28 deletions

View File

@@ -408,6 +408,12 @@ files.treesitter = function(opts)
end
end
results = utils.filter_symbols(results, opts)
if results == nil then
-- error message already printed in `utils.filter_symbols`
return
end
if vim.tbl_isempty(results) then
return
end

View File

@@ -227,6 +227,38 @@ lsp.implementations = function(opts)
return list_or_jump("textDocument/implementation", "LSP Implementations", opts)
end
local symbols_sorter = function(symbols)
if vim.tbl_isempty(symbols) then
return symbols
end
local current_buf = vim.api.nvim_get_current_buf()
-- sort adequately for workspace symbols
local filename_to_bufnr = {}
for _, symbol in ipairs(symbols) do
if filename_to_bufnr[symbol.filename] == nil then
filename_to_bufnr[symbol.filename] = vim.uri_to_bufnr(vim.uri_from_fname(symbol.filename))
end
symbol.bufnr = filename_to_bufnr[symbol.filename]
end
table.sort(symbols, function(a, b)
if a.bufnr == b.bufnr then
return a.lnum < b.lnum
end
if a.bufnr == current_buf then
return true
end
if b.bufnr == current_buf then
return false
end
return a.bufnr < b.bufnr
end)
return symbols
end
lsp.document_symbols = function(opts)
local params = vim.lsp.util.make_position_params(opts.winnr)
vim.lsp.buf_request(opts.bufnr, "textDocument/documentSymbol", params, function(err, result, _, _)
@@ -244,7 +276,7 @@ lsp.document_symbols = function(opts)
end
local locations = vim.lsp.util.symbols_to_items(result or {}, opts.bufnr) or {}
locations = utils.filter_symbols(locations, opts)
locations = utils.filter_symbols(locations, opts, symbols_sorter)
if locations == nil then
-- error message already printed in `utils.filter_symbols`
return
@@ -287,7 +319,7 @@ lsp.workspace_symbols = function(opts)
end
local locations = vim.lsp.util.symbols_to_items(server_result or {}, opts.bufnr) or {}
locations = utils.filter_symbols(locations, opts)
locations = utils.filter_symbols(locations, opts, symbols_sorter)
if locations == nil then
-- error message already printed in `utils.filter_symbols`
return
@@ -335,7 +367,7 @@ local function get_workspace_symbols_requester(bufnr, opts)
local locations = vim.lsp.util.symbols_to_items(res or {}, bufnr) or {}
if not vim.tbl_isempty(locations) then
locations = utils.filter_symbols(locations, opts) or {}
locations = utils.filter_symbols(locations, opts, symbols_sorter) or {}
end
return locations
end

View File

@@ -91,6 +91,8 @@ builtin.fd = builtin.find_files
--- - `<C-l>`: show autocompletion menu to prefilter your query by kind of ts node you want to see (i.e. `:var:`)
---@field show_line boolean: if true, shows the row:column that the result is found at (default: true)
---@field bufnr number: specify the buffer number where treesitter should run. (default: current buffer)
---@field symbols string|table: filter results by symbol kind(s)
---@field ignore_symbols string|table: list of symbols to ignore
---@field symbol_highlights table: string -> string. Matches symbol with hl_group
builtin.treesitter = require_on_exported_call("telescope.builtin.__files").treesitter