fix(treesitter.foldexpr): duplicate callbacks #37048

Problem:
VimEnter clears foldinfo, so register_cbs is called again after
VimEnter. The duplicate parser callbacks break incremental fold
computation.

Solution:
Check if the callbacks are already registered.
This commit is contained in:
Jaehwang Jung
2025-12-21 14:47:46 +09:00
committed by GitHub
parent 0d206da461
commit 756e1eb017

View File

@@ -381,6 +381,8 @@ local function on_bytes(bufnr, start_row, start_col, old_row, old_col, new_row,
end end
end end
local registered_cbs = {} ---@type table<integer, boolean>
---@param lnum integer|nil ---@param lnum integer|nil
---@return string ---@return string
function M.foldexpr(lnum) function M.foldexpr(lnum)
@@ -404,19 +406,36 @@ function M.foldexpr(lnum)
compute_folds_levels(bufnr, foldinfos[bufnr]) compute_folds_levels(bufnr, foldinfos[bufnr])
parser:register_cbs({ if not registered_cbs[bufnr] then
on_changedtree = function(tree_changes) parser:register_cbs({
on_changedtree(bufnr, tree_changes) on_changedtree = function(tree_changes)
end, on_changedtree(bufnr, tree_changes)
end,
on_bytes = function(_, _, start_row, start_col, _, old_row, old_col, _, new_row, new_col, _) on_bytes = function(
on_bytes(bufnr, start_row, start_col, old_row, old_col, new_row, new_col) _,
end, _,
start_row,
start_col,
_,
old_row,
old_col,
_,
new_row,
new_col,
_
)
on_bytes(bufnr, start_row, start_col, old_row, old_col, new_row, new_col)
end,
on_detach = function() on_detach = function()
foldinfos[bufnr] = nil foldinfos[bufnr] = nil
end, registered_cbs[bufnr] = nil
}) end,
})
registered_cbs[bufnr] = true
end
end end
return foldinfos[bufnr].levels[lnum] or '0' return foldinfos[bufnr].levels[lnum] or '0'