From 282e33ad9c96a44a092ab8a356bba7626c838b68 Mon Sep 17 00:00:00 2001 From: Steven Sojka Date: Wed, 12 Aug 2020 07:38:15 -0500 Subject: fix(definitions): optimize and fix definition highlighting --- lua/nvim-treesitter/ts_utils.lua | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'lua/nvim-treesitter/ts_utils.lua') diff --git a/lua/nvim-treesitter/ts_utils.lua b/lua/nvim-treesitter/ts_utils.lua index bf5b2208..0a5cbc60 100644 --- a/lua/nvim-treesitter/ts_utils.lua +++ b/lua/nvim-treesitter/ts_utils.lua @@ -195,4 +195,34 @@ function M.node_to_lsp_range(node) return rtn end +--- Memoizes a function based on the buffer tick of the provided bufnr. +-- The cache entry is cleared when the buffer is detached to avoid memory leaks. +-- @param fn: the fn to memoize +-- @param bufnr_fn: a function that receives all arguments passed to the function +-- and returns the bufnr from the arguments +-- @returns a memoized function +function M.memoize_by_buf_tick(fn, bufnr_fn) + local bufnr_fn = bufnr_fn or function(a) return a end + local cache = {} + + return function(...) + local bufnr = bufnr_fn(...) + local tick = api.nvim_buf_get_changedtick(bufnr) + + if cache[bufnr] then + if cache[bufnr].last_tick == tick then + return cache[bufnr].result + end + else + cache[bufnr] = {} + api.nvim_buf_attach(bufnr, false, { on_detach = function() cache[bufnr] = nil end }) + end + + cache[bufnr].last_tick = tick + cache[bufnr].result = fn(...) + + return cache[bufnr].result + end +end + return M -- cgit v1.2.3