From 20ff82d9fcdeafe2cdf4824b8af1bdeeffb513b6 Mon Sep 17 00:00:00 2001 From: Milad Rashidikhah Date: Tue, 28 Jul 2026 08:25:32 +0000 Subject: fix(treesitter): clamp unbounded fold ranges Problem: Tree-sitter uses UINT32_MAX for full-document ranges, which becomes -1 on 32-bit platforms and reaches _foldupdate as an invalid end row. Solution: Treat negative changed-range end rows as unbounded and clamp them to the buffer line count. Add a regression test that simulates the 32-bit sentinel. AI-assisted: Codex --- runtime/lua/vim/treesitter/_fold.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'runtime/lua/vim/treesitter/_fold.lua') diff --git a/runtime/lua/vim/treesitter/_fold.lua b/runtime/lua/vim/treesitter/_fold.lua index 99739753e8..2d5f3da1ba 100644 --- a/runtime/lua/vim/treesitter/_fold.lua +++ b/runtime/lua/vim/treesitter/_fold.lua @@ -291,9 +291,10 @@ local function on_changedtree(bufnr, tree_changes) local srow, _, erow, ecol = Range.unpack4(change) -- If a parser doesn't have any ranges explicitly set, treesitter will -- return a range with end_row and end_bytes with a value of UINT32_MAX, - -- so clip end_row to the max buffer line. + -- which is represented as -1 on 32-bit platforms, so clip end_row to + -- the max buffer line. -- TODO(lewis6991): Handle this generally - if erow > max_erow then + if erow > max_erow or erow < 0 then erow = max_erow elseif ecol > 0 then erow = erow + 1 -- cgit