navigator.lua/lua/navigator/codelens.lua

163 lines
4.8 KiB
Lua
Raw Normal View History

2021-08-21 23:19:11 +00:00
-- codelenses
-- https://github.com/josa42/nvim-lsp-codelenses/blob/master/lua/jg/lsp/codelenses.lua
-- https://github.com/neovim/neovim/blob/master/runtime/lua/vim/lsp/codelens.lua
local codelens = require('vim.lsp.codelens')
local log = require"navigator.util".log
local mk_handler = require"navigator.util".mk_handler
local nvim_0_6 = require"navigator.util".nvim_0_6
2021-08-23 23:17:20 +00:00
local trace = require"navigator.util".trace
2021-08-21 23:19:11 +00:00
local lsphelper = require "navigator.lspwrapper"
local api = vim.api
local gui = require "navigator.gui"
local M = {}
local config = require("navigator").config_values()
local sign_name = "NavigatorCodeLensLightBulb"
if vim.tbl_isempty(vim.fn.sign_getdefined(sign_name)) then
vim.fn.sign_define(sign_name,
{text = config.icons.code_lens_action_icon, texthl = "LspDiagnosticsSignHint"})
end
local sign_group = "nvcodelensaction"
local get_current_winid = require('navigator.util').get_current_winid
local code_lens_action = {}
local function _update_sign(line)
log("update sign at line ", line)
local winid = get_current_winid()
if code_lens_action[winid] == nil then
code_lens_action[winid] = {}
end
if code_lens_action[winid].lightbulb_line ~= 0 then
vim.fn.sign_unplace(sign_group, {id = code_lens_action[winid].lightbulb_line, buffer = "%"})
end
if line then
-- log("updatasign", line, sign_group, sign_name)
vim.fn.sign_place(line, sign_group, sign_name, "%",
{lnum = line + 1, priority = config.code_lens_action_prompt.sign_priority})
code_lens_action[winid].lightbulb_line = line
end
end
local codelens_hdlr = mk_handler(function(err, result, ctx, cfg)
2021-08-23 23:17:20 +00:00
if err or result == nil then
log("lsp code lens", vim.inspect(err), ctx, cfg)
2021-08-21 23:19:11 +00:00
return
end
2021-08-23 23:17:20 +00:00
trace("codelenes result", result)
2021-08-21 23:19:11 +00:00
for _, v in pairs(result) do
_update_sign(v.range.start.line)
end
end)
2021-08-21 23:19:11 +00:00
function M.setup()
vim.cmd('highlight! link LspCodeLens LspDiagnosticsHint')
vim.cmd('highlight! link LspCodeLensText LspDiagnosticsInformation')
vim.cmd('highlight! link LspCodeLensTextSign LspDiagnosticsSignInformation')
vim.cmd('highlight! link LspCodeLensTextSeparator Boolean')
vim.cmd('augroup navigator.codelenses')
vim.cmd(' autocmd!')
vim.cmd(
"autocmd BufEnter,CursorHold,InsertLeave <buffer> lua require('navigator.codelens').refresh()")
vim.cmd('augroup end')
local on_codelens = vim.lsp.handlers["textDocument/codeLens"]
vim.lsp.handlers["textDocument/codeLens"] = mk_handler(
function(err, result, ctx, cfg)
log(err, result, ctx.client_id, ctx.bufnr, cfg)
if nvim_0_6() then
on_codelens(err, result, ctx, cfg)
codelens_hdlr(err, result, ctx, cfg)
else
on_codelens(err, ctx.method, result, ctx.client_id, ctx.bufnr)
codelens_hdlr(err, _, result, ctx.client_id or 0, ctx.bufnr or 0)
end
end)
2021-08-21 23:19:11 +00:00
end
M.lsp_clients = {}
function M.refresh()
2021-08-23 02:56:59 +00:00
if #vim.lsp.buf_get_clients() < 1 then
log("Must have a client running to use lsp code action")
return
end
2021-08-21 23:19:11 +00:00
if not lsphelper.check_capabilities("code_lens") then
return
end
vim.lsp.codelens.refresh()
end
function M.run_action()
log("run code len action")
assert(#vim.lsp.buf_get_clients() > 0, "Must have a client running to use lsp code action")
if not lsphelper.check_capabilities("code_lens") then
return
end
local line = api.nvim_win_get_cursor(0)[1]
local bufnr = api.nvim_get_current_buf()
local lenses = codelens.get(bufnr)
if lenses == nil or #lenses == 0 then
return
end
local width = 40
2021-08-23 02:56:59 +00:00
local data = {
" " .. _NgConfigValues.icons.code_lens_action_icon .. " CodeLens Action <C-o> Apply <C-e> Exit"
}
2021-08-22 10:13:00 +00:00
local idx = 1
2021-08-21 23:19:11 +00:00
for i, lens in pairs(lenses) do
if lens.range.start.line == (line - 1) then
local title = lens.command.title:gsub("\r\n", "\\r\\n")
title = title:gsub("\n", "\\n")
2021-08-22 10:13:00 +00:00
title = string.format("[%d] %s", idx, title)
2021-08-21 23:19:11 +00:00
table.insert(data, title)
lenses[i].display_title = title
width = math.max(width, #lens.command.title)
2021-08-22 10:13:00 +00:00
idx = idx + 1
2021-08-21 23:19:11 +00:00
end
end
local apply = require('navigator.lspwrapper').apply_action
local function apply_action(action)
local action_chosen = nil
for key, value in pairs(lenses) do
if value.display_title == action then
action_chosen = value
end
end
if action_chosen == nil then
log("no match for ", action, lenses)
return
end
apply(action_chosen)
end
2021-08-22 10:13:00 +00:00
if #data > 0 then
gui.new_list_view {
items = data,
width = width + 4,
loc = "top_center",
relative = "cursor",
rawdata = true,
data = data,
on_confirm = function(pos)
log(pos)
apply_action(pos)
end,
on_move = function(pos)
log(pos)
return pos
end
}
end
2021-08-21 23:19:11 +00:00
end
return M