138 lines
2.8 KiB
Lua
138 lines
2.8 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
|
|
|
|
---@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()
|
|
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<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()
|
|
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
|