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 ---@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