mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 19:38:20 +00:00
fix(lsp): perform client side filtering of code actions (#18392)
Implement filtering of actions based on the kind when passing the 'only' parameter to code_action(). Action kinds are hierachical with a '.' as the separator, and the filter thus allows, for example, both 'quickfix' and 'quickfix.foo' when requestiong only 'quickfix'. Fix https://github.com/neovim/neovim/pull/18221#issuecomment-1110179121
This commit is contained in:
@@ -691,10 +691,38 @@ end
|
||||
--- `codeAction/resolve`
|
||||
local function on_code_action_results(results, ctx, options)
|
||||
local action_tuples = {}
|
||||
local filter = options and options.filter
|
||||
|
||||
---@private
|
||||
local function action_filter(a)
|
||||
-- filter by specified action kind
|
||||
if options and options.context and options.context.only then
|
||||
if not a.kind then
|
||||
return false
|
||||
end
|
||||
local found = false
|
||||
for _, o in ipairs(options.context.only) do
|
||||
-- action kinds are hierachical with . as a separator: when requesting only
|
||||
-- 'quickfix' this filter allows both 'quickfix' and 'quickfix.foo', for example
|
||||
if a.kind:find('^' .. o .. '$') or a.kind:find('^' .. o .. '%.') then
|
||||
found = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if not found then
|
||||
return false
|
||||
end
|
||||
end
|
||||
-- filter by user function
|
||||
if options and options.filter and not options.filter(a) then
|
||||
return false
|
||||
end
|
||||
-- no filter removed this action
|
||||
return true
|
||||
end
|
||||
|
||||
for client_id, result in pairs(results) do
|
||||
for _, action in pairs(result.result or {}) do
|
||||
if not filter or filter(action) then
|
||||
if action_filter(action) then
|
||||
table.insert(action_tuples, { client_id, action })
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user