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 ---@type table 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() local task = RefreshTask.new(session) session.current = task task:run() end local refresh, refresh_handle = util.keyed_debounce(do_refresh, REFRESH_DEBOUNCE_MS) ---@param buf integer ---@return ow.lsp.codelens.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 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() refresh_handle.cancel(self.buf) if self.current then self.current:abort() self.current = nil end end function Session:refresh() refresh(self.buf) 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