summaryrefslogtreecommitdiff
path: root/lua/nvim-treesitter/caching.lua
blob: bfda3962202d699684235cf6e1c14da694e66485 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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 = {}

  local items = setmetatable({}, {
    __index = function(tbl, key)
      rawset(tbl, key, {})
      return rawget(tbl, key)
    end
  })

  function cache.set(type_name, bufnr, value)
    if not cache.has(type_name, bufnr) then
      -- Clean up the cache if the buffer is detached
      -- to avoid memory leaks
      api.nvim_buf_attach(bufnr, false, {
        on_detach = function()
          cache.remove(type_name, bufnr)
          return true
        end
      })
    end

    items[type_name][bufnr] = value
  end

  function cache.get(type_name, bufnr)
    return items[type_name][bufnr]
  end

  function cache.has(type_name, bufnr)
    return cache.get(type_name, bufnr) ~= nil
  end

  function cache.remove(type_name, bufnr)
    items[type_name][bufnr] = nil
  end

  return cache
end

return M