nvim-treesitter/lua/nvim-treesitter/caching.lua

72 lines
1.7 KiB
Lua
Raw Normal View History

local api = vim.api
local M = {}
-- Creates a cache table for buffers keyed by a type name.
-- Cache entries attach to the buffer and cleanup entries
-- as buffers are detached.
function M.create_buffer_cache()
local cache = {}
2023-03-02 13:47:00 +09:00
---@type table<integer, table<string, any>>
local items = setmetatable({}, {
__index = function(tbl, key)
rawset(tbl, key, {})
return rawget(tbl, key)
2021-07-04 16:12:17 -05:00
end,
})
2023-03-02 13:47:00 +09:00
---@type table<integer, boolean>
2023-01-20 15:47:12 +02:00
local loaded_buffers = {}
---@param type_name string
---@param bufnr integer
---@param value any
function cache.set(type_name, bufnr, value)
2023-01-20 15:47:12 +02:00
if not loaded_buffers[bufnr] then
loaded_buffers[bufnr] = true
-- Clean up the cache if the buffer is detached
-- to avoid memory leaks
api.nvim_buf_attach(bufnr, false, {
on_detach = function()
2023-01-20 15:47:12 +02:00
cache.clear_buffer(bufnr)
2023-03-02 13:47:00 +09:00
loaded_buffers[bufnr] = nil
return true
2021-07-04 16:12:17 -05:00
end,
2023-01-20 15:47:12 +02:00
on_reload = function() end, -- this is needed to prevent on_detach being called on buffer reload
})
end
2023-03-02 13:47:00 +09:00
items[bufnr][type_name] = value
end
---@param type_name string
---@param bufnr integer
---@return any
function cache.get(type_name, bufnr)
2023-03-02 13:47:00 +09:00
return items[bufnr][type_name]
end
---@param type_name string
---@param bufnr integer
---@return boolean
function cache.has(type_name, bufnr)
return cache.get(type_name, bufnr) ~= nil
end
---@param type_name string
---@param bufnr integer
function cache.remove(type_name, bufnr)
2023-03-02 13:47:00 +09:00
items[bufnr][type_name] = nil
2023-01-20 15:47:12 +02:00
end
---@param bufnr integer
2023-01-20 15:47:12 +02:00
function cache.clear_buffer(bufnr)
2023-03-02 13:47:00 +09:00
items[bufnr] = nil
end
return cache
end
return M