aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2023-05-02 10:07:18 +0100
committerGitHub <noreply@github.com>2023-05-02 10:07:18 +0100
commitfba18a3b62310f4535d979a05288101b9af2ef50 (patch)
treef5a581c640b0e6381bbb776d400e247ae815b4fb
parentbfb19a110d93ce5cb7c09fee2442651db182ca4b (diff)
downloadrneovim-fba18a3b62310f4535d979a05288101b9af2ef50.tar.gz
rneovim-fba18a3b62310f4535d979a05288101b9af2ef50.tar.bz2
rneovim-fba18a3b62310f4535d979a05288101b9af2ef50.zip
fix(treesitter): do not calc folds on unloaded buffers
Fixes #23423
-rw-r--r--runtime/lua/vim/treesitter/_fold.lua20
1 files changed, 14 insertions, 6 deletions
diff --git a/runtime/lua/vim/treesitter/_fold.lua b/runtime/lua/vim/treesitter/_fold.lua
index 51e60bf495..edceb8217a 100644
--- a/runtime/lua/vim/treesitter/_fold.lua
+++ b/runtime/lua/vim/treesitter/_fold.lua
@@ -111,10 +111,6 @@ end
---@param srow integer?
---@param erow integer?
local function get_folds_levels(bufnr, info, srow, erow)
- if not api.nvim_buf_is_valid(bufnr) then
- return false
- end
-
srow = srow or 0
erow = normalise_erow(bufnr, erow)
@@ -210,13 +206,25 @@ local function recompute_folds()
vim._foldupdate()
end
+--- Schedule a function only if bufnr is loaded
+---@param bufnr integer
+---@param fn function
+local function schedule_if_loaded(bufnr, fn)
+ vim.schedule(function()
+ if not api.nvim_buf_is_loaded(bufnr) then
+ return
+ end
+ fn()
+ end)
+end
+
---@param bufnr integer
---@param foldinfo TS.FoldInfo
---@param tree_changes Range4[]
local function on_changedtree(bufnr, foldinfo, tree_changes)
-- For some reason, queries seem to use the old buffer state in on_bytes.
-- Get around this by scheduling and manually updating folds.
- vim.schedule(function()
+ schedule_if_loaded(bufnr, function()
for _, change in ipairs(tree_changes) do
local srow, _, erow = Range.unpack4(change)
get_folds_levels(bufnr, foldinfo, srow, erow)
@@ -238,7 +246,7 @@ local function on_bytes(bufnr, foldinfo, start_row, old_row, new_row)
foldinfo:remove_range(end_row_new, end_row_old)
elseif new_row > old_row then
foldinfo:add_range(start_row, end_row_new)
- vim.schedule(function()
+ schedule_if_loaded(bufnr, function()
get_folds_levels(bufnr, foldinfo, start_row, end_row_new)
recompute_folds()
end)