aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/treesitter/_fold.lua
diff options
context:
space:
mode:
authorJaehwang Jung <tomtomjhj@gmail.com>2024-04-23 00:29:14 +0900
committerLewis Russell <me@lewisr.dev>2024-05-07 14:36:55 +0100
commite7f50f43c82225eeecbff531b55d6ed26fad1bf5 (patch)
treedd347f9d1137af4575b76d6a31c7ba5dc464b189 /runtime/lua/vim/treesitter/_fold.lua
parent4caf71af58f34726bf6f1d8a2d5ddeaf650e6286 (diff)
downloadrneovim-e7f50f43c82225eeecbff531b55d6ed26fad1bf5.tar.gz
rneovim-e7f50f43c82225eeecbff531b55d6ed26fad1bf5.tar.bz2
rneovim-e7f50f43c82225eeecbff531b55d6ed26fad1bf5.zip
fix(treesitter): clip end row early
Problem: UINT32_MAX + 1 passed to vim._foldupdate. Solution: Clip the end row from treesitter asap to avoid such issues.
Diffstat (limited to 'runtime/lua/vim/treesitter/_fold.lua')
-rw-r--r--runtime/lua/vim/treesitter/_fold.lua25
1 files changed, 9 insertions, 16 deletions
diff --git a/runtime/lua/vim/treesitter/_fold.lua b/runtime/lua/vim/treesitter/_fold.lua
index 09d3f3368f..eecf1ad6b1 100644
--- a/runtime/lua/vim/treesitter/_fold.lua
+++ b/runtime/lua/vim/treesitter/_fold.lua
@@ -103,20 +103,6 @@ local function edit_range(range, srow, erow_old, erow_new)
range[2] = math.max(range[2], erow_new)
end
---- 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.
----
---- TODO(lewis6991): Handle this generally
----
---- @param bufnr integer
---- @param erow integer? 0-indexed, exclusive
---- @return integer
-local function normalise_erow(bufnr, erow)
- local max_erow = api.nvim_buf_line_count(bufnr)
- return math.min(erow or max_erow, max_erow)
-end
-
-- TODO(lewis6991): Setup a decor provider so injections folds can be parsed
-- as the window is redrawn
---@param bufnr integer
@@ -126,7 +112,7 @@ end
---@param parse_injections? boolean
local function compute_folds_levels(bufnr, info, srow, erow, parse_injections)
srow = srow or 0
- erow = normalise_erow(bufnr, erow)
+ erow = erow or api.nvim_buf_line_count(bufnr)
local parser = ts.get_parser(bufnr)
@@ -314,9 +300,16 @@ end
local function on_changedtree(bufnr, foldinfo, tree_changes)
schedule_if_loaded(bufnr, function()
local srow_upd, erow_upd ---@type integer?, integer?
+ local max_erow = api.nvim_buf_line_count(bufnr)
for _, change in ipairs(tree_changes) do
local srow, _, erow, ecol = Range.unpack4(change)
- if ecol > 0 then
+ -- 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.
+ -- TODO(lewis6991): Handle this generally
+ if erow > max_erow then
+ erow = max_erow
+ elseif ecol > 0 then
erow = erow + 1
end
-- Start from `srow - foldminlines`, because this edit may have shrunken the fold below limit.