Files
nvim/lua/lsp/codelens/session.lua
T

110 lines
2.3 KiB
Lua

local RefreshTask = require("lsp.codelens.refresh_task")
local Row = require("lsp.codelens.row")
local util = require("util")
local REFRESH_DEBOUNCE_MS = 200
---@class ow.lsp.codelens.Session
---@field buf integer
---@field enabled boolean
---@field attached boolean
---@field rows table<integer, ow.lsp.codelens.Row>
---@field current? ow.lsp.codelens.RefreshTask
local Session = {}
Session.__index = Session
---@param session ow.lsp.codelens.Session
local function do_refresh(session)
if not session.enabled then
return
end
session:abort()
local task = RefreshTask.new(session)
session.current = task
task:run()
end
local refresher = 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)
end
function Session:abort()
refresher:cancel(self)
if self.current then
self.current:abort()
self.current = nil
end
end
function Session:refresh()
refresher(self)
end
function Session:render()
if not vim.api.nvim_buf_is_valid(self.buf) then
return
end
if not self.enabled then
Row.clear_all(self.buf)
return
end
for _, row in pairs(self.rows) do
row:render(self.buf)
end
Row.prune(self.buf, self.rows)
end
function Session:attach()
if self.attached then
return
end
self.attached = true
vim.api.nvim_buf_attach(self.buf, false, {
on_lines = function()
if not self.enabled then
self.attached = false
return true
end
self:refresh()
end,
on_reload = function()
if self.enabled then
self:refresh()
end
end,
on_detach = function()
self.attached = false
end,
})
end
---@param value boolean
function Session:enable(value)
self.enabled = value
if value then
self:attach()
self:refresh()
else
self:abort()
self.rows = {}
self:render()
end
end
function Session:toggle()
self:enable(not self.enabled)
end
return Session