mirror of
https://github.com/neovim/neovim.git
synced 2026-07-31 12:49:11 +00:00
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
This commit is contained in:
committed by
Christian Clason
parent
26357692c8
commit
20ff82d9fc
@@ -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
|
||||
|
||||
@@ -824,4 +824,42 @@ t2]])
|
||||
|
|
||||
]])
|
||||
end)
|
||||
|
||||
it('clamps unbounded changed ranges on 32-bit platforms', function()
|
||||
insert([[
|
||||
one
|
||||
two]])
|
||||
|
||||
exec_lua(function()
|
||||
local parser = {}
|
||||
|
||||
function parser:parse(_, callback)
|
||||
if callback then
|
||||
callback(nil, {})
|
||||
end
|
||||
end
|
||||
|
||||
function parser:for_each_tree() end
|
||||
|
||||
function parser:register_cbs(callbacks)
|
||||
self.callbacks = callbacks
|
||||
end
|
||||
|
||||
vim.treesitter.get_parser = function()
|
||||
return parser
|
||||
end
|
||||
|
||||
vim.treesitter.foldexpr()
|
||||
vim.wo.foldmethod = 'expr'
|
||||
vim._foldupdate = function(_, first, last)
|
||||
_G.foldupdate_range = { first, last }
|
||||
end
|
||||
|
||||
-- UINT32_MAX is represented as -1 by Lua integers on 32-bit platforms.
|
||||
parser.callbacks.on_changedtree({ { 0, 0, -1, -1 } })
|
||||
end)
|
||||
poke_eventloop()
|
||||
|
||||
eq({ 0, 2 }, exec_lua('return _G.foldupdate_range'))
|
||||
end)
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user