refactor: address emmylua diagnostics
This commit is contained in:
+10
-23
@@ -7,23 +7,13 @@ local log = require("log")
|
||||
|
||||
local GROUP = vim.api.nvim_create_augroup("ow.lsp.codelens", { clear = true })
|
||||
|
||||
---@type table<integer, ow.lsp.codelens.Session>
|
||||
local session_by_buf = {}
|
||||
|
||||
local M = {}
|
||||
|
||||
---@param buf integer
|
||||
---@return ow.lsp.codelens.Session
|
||||
local function get_session(buf)
|
||||
session_by_buf[buf] = session_by_buf[buf] or Session.new(buf)
|
||||
return session_by_buf[buf]
|
||||
end
|
||||
|
||||
---@param buf? integer
|
||||
---@return boolean
|
||||
function M.is_enabled(buf)
|
||||
buf = buf or vim.api.nvim_get_current_buf()
|
||||
local session = session_by_buf[buf]
|
||||
local session = Session.find(buf)
|
||||
return session ~= nil and session.enabled
|
||||
end
|
||||
|
||||
@@ -34,13 +24,13 @@ function M.enable(value, buf)
|
||||
value = true
|
||||
end
|
||||
buf = buf or vim.api.nvim_get_current_buf()
|
||||
get_session(buf):enable(value)
|
||||
Session.get(buf):enable(value)
|
||||
end
|
||||
|
||||
---@param buf? integer
|
||||
function M.toggle(buf)
|
||||
buf = buf or vim.api.nvim_get_current_buf()
|
||||
get_session(buf):toggle()
|
||||
Session.get(buf):toggle()
|
||||
end
|
||||
|
||||
---@class ow.lsp.codelens.SetupOpts : ow.lsp.codelens.row.ConfigureOpts
|
||||
@@ -49,17 +39,18 @@ end
|
||||
function M.setup(opts)
|
||||
Row.configure(opts or {})
|
||||
|
||||
local method = vim.lsp.protocol.Methods.workspace_codeLens_refresh
|
||||
vim.lsp.handlers[method] = function(err, _, ctx)
|
||||
---@param err lsp.ResponseError?
|
||||
---@param ctx lsp.HandlerContext
|
||||
vim.lsp.handlers["workspace/codeLens/refresh"] = function(err, _, ctx)
|
||||
if err then
|
||||
log.warning(
|
||||
"client %d: error on %s: %s",
|
||||
ctx.client_id,
|
||||
method,
|
||||
ctx.method,
|
||||
err.message
|
||||
)
|
||||
end
|
||||
for buf, session in pairs(session_by_buf) do
|
||||
for buf, session in pairs(Session.all()) do
|
||||
if
|
||||
session.enabled
|
||||
and #vim.lsp.get_clients({ bufnr = buf, id = ctx.client_id })
|
||||
@@ -74,7 +65,7 @@ function M.setup(opts)
|
||||
vim.api.nvim_create_autocmd({ "BufEnter", "LspAttach" }, {
|
||||
group = GROUP,
|
||||
callback = function(ev)
|
||||
local session = session_by_buf[ev.buf]
|
||||
local session = Session.find(ev.buf)
|
||||
if session and session.enabled then
|
||||
session:refresh()
|
||||
end
|
||||
@@ -84,11 +75,7 @@ function M.setup(opts)
|
||||
vim.api.nvim_create_autocmd({ "BufDelete", "BufWipeout" }, {
|
||||
group = GROUP,
|
||||
callback = function(ev)
|
||||
local session = session_by_buf[ev.buf]
|
||||
if session then
|
||||
session:abort()
|
||||
end
|
||||
session_by_buf[ev.buf] = nil
|
||||
Session.remove(ev.buf)
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
@@ -15,7 +15,8 @@ function RefreshTask.new(session)
|
||||
session = session,
|
||||
aborted = false,
|
||||
cancels = {},
|
||||
}, RefreshTask)
|
||||
},
|
||||
RefreshTask)
|
||||
end
|
||||
|
||||
---@param cancel fun()
|
||||
@@ -35,20 +36,19 @@ end
|
||||
---@param lens lsp.CodeLens
|
||||
---@param row ow.lsp.codelens.Row
|
||||
function RefreshTask:resolve(client, lens, row)
|
||||
local method = vim.lsp.protocol.Methods.codeLens_resolve
|
||||
local _, req_id = client:request(
|
||||
method,
|
||||
"codeLens/resolve",
|
||||
lens,
|
||||
---@param err lsp.ResponseError?
|
||||
---@param resolved lsp.CodeLens?
|
||||
function(err, resolved)
|
||||
---@param ctx lsp.HandlerContext
|
||||
function(err, resolved, ctx)
|
||||
if self.aborted then
|
||||
return
|
||||
end
|
||||
if err then
|
||||
log.warning(
|
||||
"client %d: %s failed: %s",
|
||||
client.id,
|
||||
method,
|
||||
"client %d: %s failed: %s", client.id, ctx.method,
|
||||
err.message
|
||||
)
|
||||
end
|
||||
@@ -77,33 +77,27 @@ function RefreshTask:process_lens(rows, client, lens)
|
||||
row:add(lens)
|
||||
return
|
||||
end
|
||||
if
|
||||
not client
|
||||
or not client:supports_method(vim.lsp.protocol.Methods.codeLens_resolve)
|
||||
then
|
||||
if not client or not client:supports_method("codeLens/resolve") then
|
||||
return
|
||||
end
|
||||
row:expect()
|
||||
self:resolve(client, lens, row)
|
||||
end
|
||||
|
||||
---@param responses table<integer, ow.lsp.CodeLensResponse>
|
||||
function RefreshTask:process_responses(responses)
|
||||
local method = vim.lsp.protocol.Methods.textDocument_codeLens
|
||||
---@param results table<integer, ow.lsp.CodeLensResponse>
|
||||
function RefreshTask:process_results(results)
|
||||
local session = self.session
|
||||
local new_rows = {}
|
||||
for client_id, response in pairs(responses) do
|
||||
if response.err then
|
||||
for client_id, result in pairs(results) do
|
||||
if result.err then
|
||||
log.warning(
|
||||
"client %d: %s failed: %s",
|
||||
client_id,
|
||||
method,
|
||||
response.err.message
|
||||
"client %d: %s failed: %s", client_id, result.context.method,
|
||||
result.err.message
|
||||
)
|
||||
end
|
||||
if not response.err and type(response.result) == "table" then
|
||||
if not result.err and type(result.result) == "table" then
|
||||
local client = vim.lsp.get_client_by_id(client_id)
|
||||
for _, lens in ipairs(response.result) do
|
||||
for _, lens in ipairs(result.result) do
|
||||
self:process_lens(new_rows, client, lens)
|
||||
end
|
||||
end
|
||||
@@ -113,19 +107,18 @@ function RefreshTask:process_responses(responses)
|
||||
end
|
||||
|
||||
function RefreshTask:run()
|
||||
local method = vim.lsp.protocol.Methods.textDocument_codeLens
|
||||
local params = {
|
||||
textDocument = vim.lsp.util.make_text_document_params(self.session.buf),
|
||||
}
|
||||
local cancel = vim.lsp.buf_request_all(
|
||||
self.session.buf,
|
||||
method,
|
||||
"textDocument/codeLens",
|
||||
params,
|
||||
function(responses)
|
||||
function(results)
|
||||
if self.aborted then
|
||||
return
|
||||
end
|
||||
self:process_responses(responses)
|
||||
self:process_results(results)
|
||||
end
|
||||
)
|
||||
self:track(cancel)
|
||||
|
||||
@@ -6,9 +6,12 @@ local NS = vim.api.nvim_create_namespace("ow.lsp.codelens")
|
||||
local position = "above"
|
||||
local separator = " | "
|
||||
|
||||
---@class ow.lsp.CodeLens : lsp.CodeLens
|
||||
---@field command lsp.Command
|
||||
|
||||
---@class ow.lsp.codelens.Row
|
||||
---@field row integer
|
||||
---@field lenses lsp.CodeLens[]
|
||||
---@field lenses ow.lsp.CodeLens[]
|
||||
---@field pending integer
|
||||
local Row = {}
|
||||
Row.__index = Row
|
||||
@@ -19,7 +22,7 @@ function Row.new(row)
|
||||
return setmetatable({ row = row, lenses = {}, pending = 0 }, Row)
|
||||
end
|
||||
|
||||
---@param lens lsp.CodeLens
|
||||
---@param lens ow.lsp.CodeLens
|
||||
function Row:add(lens)
|
||||
table.insert(self.lenses, lens)
|
||||
end
|
||||
@@ -31,8 +34,8 @@ end
|
||||
---@param lens? lsp.CodeLens
|
||||
function Row:resolve(lens)
|
||||
self.pending = self.pending - 1
|
||||
if lens then
|
||||
table.insert(self.lenses, lens)
|
||||
if lens and lens.command then
|
||||
self:add(lens)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -58,7 +61,9 @@ function Row:render(buf)
|
||||
end
|
||||
end
|
||||
|
||||
local col, opts
|
||||
---@type vim.api.keyset.set_extmark
|
||||
local opts
|
||||
local col
|
||||
if position == "above" then
|
||||
local line = vim.api.nvim_buf_get_lines(
|
||||
buf,
|
||||
@@ -79,7 +84,8 @@ function Row:render(buf)
|
||||
hl_mode = "combine",
|
||||
}
|
||||
else
|
||||
col = position == "inline" and self.lenses[1].range.start.character or 0
|
||||
local first = assert(self.lenses[1])
|
||||
col = position == "inline" and first.range.start.character or 0
|
||||
opts = {
|
||||
virt_text = parts,
|
||||
virt_text_pos = position,
|
||||
@@ -97,6 +103,11 @@ function Row:render(buf)
|
||||
{ self.row, -1 },
|
||||
{ details = true }
|
||||
)
|
||||
---@type {
|
||||
--- id: integer,
|
||||
--- col: integer,
|
||||
--- details: vim.api.keyset.extmark_details?
|
||||
---}
|
||||
local primary
|
||||
for i, mark in ipairs(marks) do
|
||||
if i == 1 then
|
||||
@@ -107,7 +118,7 @@ function Row:render(buf)
|
||||
end
|
||||
|
||||
if primary and primary.col == col and primary.details then
|
||||
local d = primary.details --[[@as vim.api.keyset.extmark_details]]
|
||||
local d = primary.details
|
||||
local same = opts.virt_lines
|
||||
and vim.deep_equal(d.virt_lines, opts.virt_lines)
|
||||
and d.virt_lines_above == opts.virt_lines_above
|
||||
|
||||
@@ -13,9 +13,13 @@ local REFRESH_DEBOUNCE_MS = 200
|
||||
local Session = {}
|
||||
Session.__index = Session
|
||||
|
||||
---@param session ow.lsp.codelens.Session
|
||||
local function do_refresh(session)
|
||||
if not session.enabled then
|
||||
---@type table<integer, ow.lsp.codelens.Session>
|
||||
local by_buf = {}
|
||||
|
||||
---@param buf integer
|
||||
local function do_refresh(buf)
|
||||
local session = by_buf[buf]
|
||||
if not session or not session.enabled then
|
||||
return
|
||||
end
|
||||
session:abort()
|
||||
@@ -24,21 +28,45 @@ local function do_refresh(session)
|
||||
task:run()
|
||||
end
|
||||
|
||||
local refresher = util.keyed_debounce(do_refresh, REFRESH_DEBOUNCE_MS)
|
||||
local refresh, refresh_handle =
|
||||
util.keyed_debounce(do_refresh, REFRESH_DEBOUNCE_MS)
|
||||
|
||||
---@param buf integer
|
||||
---@return ow.lsp.codelens.Session
|
||||
function Session.new(buf)
|
||||
return setmetatable({
|
||||
buf = buf,
|
||||
enabled = false,
|
||||
attached = false,
|
||||
rows = {},
|
||||
}, Session)
|
||||
function Session.get(buf)
|
||||
if not by_buf[buf] then
|
||||
by_buf[buf] = setmetatable({
|
||||
buf = buf,
|
||||
enabled = false,
|
||||
attached = false,
|
||||
rows = {},
|
||||
}, Session)
|
||||
end
|
||||
return by_buf[buf]
|
||||
end
|
||||
|
||||
---@param buf integer
|
||||
---@return ow.lsp.codelens.Session?
|
||||
function Session.find(buf)
|
||||
return by_buf[buf]
|
||||
end
|
||||
|
||||
---@return table<integer, ow.lsp.codelens.Session>
|
||||
function Session.all()
|
||||
return by_buf
|
||||
end
|
||||
|
||||
---@param buf integer
|
||||
function Session.remove(buf)
|
||||
local session = by_buf[buf]
|
||||
if session then
|
||||
session:abort()
|
||||
end
|
||||
by_buf[buf] = nil
|
||||
end
|
||||
|
||||
function Session:abort()
|
||||
refresher:cancel(self)
|
||||
refresh_handle.cancel(self.buf)
|
||||
if self.current then
|
||||
self.current:abort()
|
||||
self.current = nil
|
||||
@@ -46,7 +74,7 @@ function Session:abort()
|
||||
end
|
||||
|
||||
function Session:refresh()
|
||||
refresher(self)
|
||||
refresh(self.buf)
|
||||
end
|
||||
|
||||
function Session:render()
|
||||
|
||||
Reference in New Issue
Block a user