|
|
|
@ -192,138 +192,3 @@ code_action.code_action_prompt = function()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return code_action
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--[[
|
|
|
|
|
|
|
|
|
|
code_action.code_action_handler = util.mk_handler(function(err, results, ctx, cfg)
|
|
|
|
|
log(ctx)
|
|
|
|
|
if err ~= nil then
|
|
|
|
|
log("code action err", err, results, ctx, cfg)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
on_code_action_results(results, ctx)
|
|
|
|
|
end)
|
|
|
|
|
local function code_action_request(params)
|
|
|
|
|
local bufnr = vim.api.nvim_get_current_buf()
|
|
|
|
|
local method = 'textDocument/codeAction'
|
|
|
|
|
vim.lsp.buf_request_all(bufnr, method, params, function(results)
|
|
|
|
|
on_code_action_results(results, {bufnr = bufnr, method = method, params = params})
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function on_code_action_results(results, ctx, client)
|
|
|
|
|
local trace = log
|
|
|
|
|
local action_tuples = {}
|
|
|
|
|
|
|
|
|
|
local data = {" Auto Fix <C-o> Apply <C-e> Exit"}
|
|
|
|
|
|
|
|
|
|
for client_id, result in pairs(results) do
|
|
|
|
|
for i, action in pairs(result.result or {}) do
|
|
|
|
|
local title = 'apply action'
|
|
|
|
|
trace(action)
|
|
|
|
|
if action.edit and action.edit.title then
|
|
|
|
|
local edit = action.edit
|
|
|
|
|
title = edit.title:gsub("\r\n", " ↳ ")
|
|
|
|
|
title = title:gsub("\n", " ↳ ")
|
|
|
|
|
elseif action.title then
|
|
|
|
|
title = action.title:gsub("\r\n", " ↳ ")
|
|
|
|
|
title = title:gsub("\n", " ↳ ")
|
|
|
|
|
elseif action.command and action.command.title then
|
|
|
|
|
title = action.command.title:gsub("\n", " ↳ ")
|
|
|
|
|
title = title:gsub("\n", " ↳ ")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local edit = action.edit or {}
|
|
|
|
|
-- trace(edit.documentChanges)
|
|
|
|
|
if edit.documentChanges or edit.changes then
|
|
|
|
|
local changes = edit.documentChanges or edit.changes
|
|
|
|
|
-- trace(action.edit.documentChanges)
|
|
|
|
|
for _, change in pairs(changes or {}) do
|
|
|
|
|
-- trace(change)
|
|
|
|
|
if change.edits then
|
|
|
|
|
title = title .. " [newText:]"
|
|
|
|
|
for _, ed in pairs(change.edits) do
|
|
|
|
|
-- trace(ed)
|
|
|
|
|
if ed.newText and ed.newText ~= "" then
|
|
|
|
|
local newText = ed.newText:gsub("\n\t", " ↳ ")
|
|
|
|
|
newText = newText:gsub("\n", "↳")
|
|
|
|
|
title = title .. " (" .. newText
|
|
|
|
|
if ed.range then
|
|
|
|
|
title = title .. " line: " .. tostring(ed.range.start.line) .. ")"
|
|
|
|
|
else
|
|
|
|
|
title = title .. ")"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif change.newText and change.newText ~= "" then
|
|
|
|
|
local newText = change.newText:gsub("\"\n\t\"", " ↳ ")
|
|
|
|
|
newText = newText:gsub("\n", "↳")
|
|
|
|
|
title = title .. " (newText: " .. newText
|
|
|
|
|
if change.range then
|
|
|
|
|
title = title .. " line: " .. tostring(change.range.start.line) .. ")"
|
|
|
|
|
else
|
|
|
|
|
title = title .. ")"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
title = string.format("[%d] %s", i, title)
|
|
|
|
|
table.insert(data, title)
|
|
|
|
|
table.insert(action_tuples, {client_id, action, title, i})
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
log(action_tuples)
|
|
|
|
|
log(data)
|
|
|
|
|
|
|
|
|
|
if #action_tuples == 0 then
|
|
|
|
|
vim.notify('No code actions available', vim.log.levels.INFO)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local width = 42
|
|
|
|
|
for _, str in ipairs(data) do
|
|
|
|
|
if #str > width then
|
|
|
|
|
width = #str
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local divider = string.rep('─', width + 2)
|
|
|
|
|
|
|
|
|
|
table.insert(data, 2, divider)
|
|
|
|
|
|
|
|
|
|
local listview = gui.new_list_view {
|
|
|
|
|
items = data,
|
|
|
|
|
width = width + 4,
|
|
|
|
|
loc = "top_center",
|
|
|
|
|
relative = "cursor",
|
|
|
|
|
rawdata = true,
|
|
|
|
|
data = data,
|
|
|
|
|
on_confirm = function(item)
|
|
|
|
|
trace(item)
|
|
|
|
|
local action_chosen = nil
|
|
|
|
|
for _, value in pairs(action_tuples) do
|
|
|
|
|
if value[3] == item then
|
|
|
|
|
action_chosen = value
|
|
|
|
|
return require('navigator.lspwrapper').on_user_choice(action_chosen, ctx)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
on_move = function(pos)
|
|
|
|
|
trace(pos)
|
|
|
|
|
return pos
|
|
|
|
|
end
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log("new buffer", listview.bufnr)
|
|
|
|
|
vim.api.nvim_buf_add_highlight(listview.bufnr, -1, 'Title', 0, 0, -1)
|
|
|
|
|
|
|
|
|
|
-- let move down 2 pos
|
|
|
|
|
ListViewCtrl:on_next()
|
|
|
|
|
ListViewCtrl:on_next()
|
|
|
|
|
end
|
|
|
|
|
]]
|
|
|
|
|