fix(lsp.references): include_current_line option regression (#3091)
* Fix jump regression in LSP references action handler This change restores the possibility to exclude the current line when invoking the lsp_references picker. - opts.include_current_line is by default unset, so the previous equality check would fail unless the option was set explicitly. - vim.api.nvim_win_get_cursor() returns both line and column, so it can't be directly compared with the returned line number. - The actual comparison was expecting quickfix-like items, when in actuality, we were dealing with raw LSP location objects. * lsp: Pass offset_encoding to action_handlers * LSP: Action handlers take both locations and items * LSP: Rename (flattened_)results → locations * LSP: Early return in list_or_jump
This commit is contained in:
@@ -97,31 +97,44 @@ lsp.outgoing_calls = function(opts)
|
|||||||
calls(opts, "to")
|
calls(opts, "to")
|
||||||
end
|
end
|
||||||
|
|
||||||
---@type { [string]: fun(results: table, opts: table): table }
|
---@type { [string]: fun(results: table, items: table, opts: table): table, table }
|
||||||
local action_handlers = {
|
local action_handlers = {
|
||||||
["textDocument/references"] = function(results, opts)
|
["textDocument/references"] = function(results, items, opts)
|
||||||
if opts.include_current_line == false then
|
if not opts.include_current_line then
|
||||||
results = vim.tbl_filter(function(result)
|
local retresults = {}
|
||||||
return not (
|
local retitems = {}
|
||||||
result.filename == vim.api.nvim_buf_get_name(opts.bufnr)
|
|
||||||
and result.lnum == vim.api.nvim_win_get_cursor(opts.winnr)
|
for i, item in pairs(items) do
|
||||||
|
if
|
||||||
|
not (
|
||||||
|
item.filename == vim.api.nvim_buf_get_name(opts.bufnr)
|
||||||
|
and item.lnum == vim.api.nvim_win_get_cursor(opts.winnr)[1]
|
||||||
)
|
)
|
||||||
end, results)
|
then
|
||||||
|
table.insert(retresults, results[i])
|
||||||
|
table.insert(retitems, items[i])
|
||||||
end
|
end
|
||||||
return results
|
end
|
||||||
|
|
||||||
|
return retresults, retitems
|
||||||
|
end
|
||||||
|
|
||||||
|
return results, items
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
---@param action string
|
---@param action string
|
||||||
---@param results table
|
---@param locations table
|
||||||
|
---@param items table
|
||||||
---@param opts table
|
---@param opts table
|
||||||
---@return table results
|
---@return table results, table items
|
||||||
local apply_action_handler = function(action, results, opts)
|
local apply_action_handler = function(action, locations, items, opts)
|
||||||
local handler = action_handlers[action]
|
local handler = action_handlers[action]
|
||||||
if handler then
|
if handler then
|
||||||
return handler(results, opts)
|
return handler(locations, items, opts)
|
||||||
end
|
end
|
||||||
return results
|
|
||||||
|
return locations, items
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param action string
|
---@param action string
|
||||||
@@ -139,21 +152,24 @@ local function list_or_jump(action, title, params, opts)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local flattened_results = {}
|
local locations = {}
|
||||||
if not vim.tbl_islist(result) then
|
if not vim.tbl_islist(result) then
|
||||||
flattened_results = { result }
|
locations = { result }
|
||||||
end
|
end
|
||||||
vim.list_extend(flattened_results, result)
|
vim.list_extend(locations, result)
|
||||||
|
|
||||||
flattened_results = apply_action_handler(action, flattened_results, opts)
|
|
||||||
|
|
||||||
local offset_encoding = vim.lsp.get_client_by_id(ctx.client_id).offset_encoding
|
local offset_encoding = vim.lsp.get_client_by_id(ctx.client_id).offset_encoding
|
||||||
|
local items = vim.lsp.util.locations_to_items(locations)
|
||||||
|
|
||||||
if vim.tbl_isempty(flattened_results) then
|
locations, items = apply_action_handler(action, locations, items, opts)
|
||||||
|
|
||||||
|
if vim.tbl_isempty(locations) then
|
||||||
return
|
return
|
||||||
elseif #flattened_results == 1 and opts.jump_type ~= "never" then
|
end
|
||||||
|
|
||||||
|
if #locations == 1 and opts.jump_type ~= "never" then
|
||||||
local current_uri = params.textDocument.uri
|
local current_uri = params.textDocument.uri
|
||||||
local target_uri = flattened_results[1].uri or flattened_results[1].targetUri
|
local target_uri = locations[1].uri or locations[1].targetUri
|
||||||
if current_uri ~= target_uri then
|
if current_uri ~= target_uri then
|
||||||
local cmd
|
local cmd
|
||||||
local file_path = vim.uri_to_fname(target_uri)
|
local file_path = vim.uri_to_fname(target_uri)
|
||||||
@@ -172,14 +188,13 @@ local function list_or_jump(action, title, params, opts)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
vim.lsp.util.jump_to_location(flattened_results[1], offset_encoding, opts.reuse_win)
|
vim.lsp.util.jump_to_location(locations[1], offset_encoding, opts.reuse_win)
|
||||||
else
|
else
|
||||||
local locations = vim.lsp.util.locations_to_items(flattened_results, offset_encoding)
|
|
||||||
pickers
|
pickers
|
||||||
.new(opts, {
|
.new(opts, {
|
||||||
prompt_title = title,
|
prompt_title = title,
|
||||||
finder = finders.new_table {
|
finder = finders.new_table {
|
||||||
results = locations,
|
results = items,
|
||||||
entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts),
|
entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts),
|
||||||
},
|
},
|
||||||
previewer = conf.qflist_previewer(opts),
|
previewer = conf.qflist_previewer(opts),
|
||||||
|
|||||||
Reference in New Issue
Block a user