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:
committed by
GitHub
parent
e504cf03c2
commit
942fe5faef
@@ -408,6 +408,12 @@ files.treesitter = function(opts)
|
|||||||
end
|
end
|
||||||
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
|
if vim.tbl_isempty(results) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -227,6 +227,38 @@ lsp.implementations = function(opts)
|
|||||||
return list_or_jump("textDocument/implementation", "LSP Implementations", opts)
|
return list_or_jump("textDocument/implementation", "LSP Implementations", opts)
|
||||||
end
|
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)
|
lsp.document_symbols = function(opts)
|
||||||
local params = vim.lsp.util.make_position_params(opts.winnr)
|
local params = vim.lsp.util.make_position_params(opts.winnr)
|
||||||
vim.lsp.buf_request(opts.bufnr, "textDocument/documentSymbol", params, function(err, result, _, _)
|
vim.lsp.buf_request(opts.bufnr, "textDocument/documentSymbol", params, function(err, result, _, _)
|
||||||
@@ -244,7 +276,7 @@ lsp.document_symbols = function(opts)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local locations = vim.lsp.util.symbols_to_items(result or {}, opts.bufnr) or {}
|
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
|
if locations == nil then
|
||||||
-- error message already printed in `utils.filter_symbols`
|
-- error message already printed in `utils.filter_symbols`
|
||||||
return
|
return
|
||||||
@@ -287,7 +319,7 @@ lsp.workspace_symbols = function(opts)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local locations = vim.lsp.util.symbols_to_items(server_result or {}, opts.bufnr) or {}
|
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
|
if locations == nil then
|
||||||
-- error message already printed in `utils.filter_symbols`
|
-- error message already printed in `utils.filter_symbols`
|
||||||
return
|
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 {}
|
local locations = vim.lsp.util.symbols_to_items(res or {}, bufnr) or {}
|
||||||
if not vim.tbl_isempty(locations) then
|
if not vim.tbl_isempty(locations) then
|
||||||
locations = utils.filter_symbols(locations, opts) or {}
|
locations = utils.filter_symbols(locations, opts, symbols_sorter) or {}
|
||||||
end
|
end
|
||||||
return locations
|
return locations
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -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:`)
|
--- - `<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 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 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
|
---@field symbol_highlights table: string -> string. Matches symbol with hl_group
|
||||||
builtin.treesitter = require_on_exported_call("telescope.builtin.__files").treesitter
|
builtin.treesitter = require_on_exported_call("telescope.builtin.__files").treesitter
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ utils.repeated_table = function(n, val)
|
|||||||
return empty_lines
|
return empty_lines
|
||||||
end
|
end
|
||||||
|
|
||||||
utils.filter_symbols = function(results, opts)
|
utils.filter_symbols = function(results, opts, post_filter)
|
||||||
local has_ignore = opts.ignore_symbols ~= nil
|
local has_ignore = opts.ignore_symbols ~= nil
|
||||||
local has_symbols = opts.symbols ~= nil
|
local has_symbols = opts.symbols ~= nil
|
||||||
local filtered_symbols
|
local filtered_symbols
|
||||||
@@ -86,31 +86,11 @@ utils.filter_symbols = function(results, opts)
|
|||||||
end, results)
|
end, results)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- TODO(conni2461): If you understand this correctly then we sort the results table based on the bufnr
|
if type(post_filter) == "function" then
|
||||||
-- If you ask me this should be its own function, that happens after the filtering part and should be
|
filtered_symbols = post_filter(filtered_symbols)
|
||||||
-- called in the lsp function directly
|
end
|
||||||
local current_buf = vim.api.nvim_get_current_buf()
|
|
||||||
if not vim.tbl_isempty(filtered_symbols) then
|
if not vim.tbl_isempty(filtered_symbols) then
|
||||||
-- filter adequately for workspace symbols
|
|
||||||
local filename_to_bufnr = {}
|
|
||||||
for _, symbol in ipairs(filtered_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(filtered_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 filtered_symbols
|
return filtered_symbols
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user