mirror of
https://github.com/neovim/neovim.git
synced 2026-07-12 20:30:35 +00:00
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:
@@ -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'
|
||||||
|
|||||||
Reference in New Issue
Block a user