diff options
| author | Milad Rashidikhah <mrashidikhah32@gmail.com> | 2026-07-28 08:25:32 +0000 |
|---|---|---|
| committer | Christian Clason <ch.clason+github@icloud.com> | 2026-07-28 11:00:30 +0200 |
| commit | 20ff82d9fcdeafe2cdf4824b8af1bdeeffb513b6 (patch) | |
| tree | ad54a3bdfbde30b19ba446bbbf33da0f00e6eae2 /runtime/lua | |
| parent | 26357692c8089a2e4968cff716e412491382787a (diff) | |
| download | rneovim-20ff82d9fcdeafe2cdf4824b8af1bdeeffb513b6.tar.gz rneovim-20ff82d9fcdeafe2cdf4824b8af1bdeeffb513b6.tar.bz2 rneovim-20ff82d9fcdeafe2cdf4824b8af1bdeeffb513b6.zip | |
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
Diffstat (limited to 'runtime/lua')
| -rw-r--r-- | runtime/lua/vim/treesitter/_fold.lua | 5 |
1 files changed, 3 insertions, 2 deletions
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 |