fix(treesitter): redraw added/removed injections properly (#23287)

When injections are added or removed make sure to:
- invoke 'changedtree' callbacks for when new trees are added.
- invoke 'changedtree' callbacks for when trees are invalidated
- redraw regions when languagetree children are removed
This commit is contained in:
Lewis Russell
2023-04-30 16:11:38 +01:00
committed by GitHub
parent 7e3d6ff405
commit 19a793545f
4 changed files with 156 additions and 56 deletions

View File

@@ -76,9 +76,6 @@ function TSHighlighter.new(tree, opts)
opts = opts or {} ---@type { queries: table<string,string> }
self.tree = tree
tree:register_cbs({
on_changedtree = function(...)
self:on_changedtree(...)
end,
on_bytes = function(...)
self:on_bytes(...)
end,
@@ -87,6 +84,17 @@ function TSHighlighter.new(tree, opts)
end,
})
tree:register_cbs({
on_changedtree = function(...)
self:on_changedtree(...)
end,
on_child_removed = function(child)
child:for_each_tree(function(t)
self:on_changedtree(t:included_ranges(true))
end)
end,
}, true)
self.bufnr = tree:source() --[[@as integer]]
self.edit_count = 0
self.redraw_count = 0
@@ -177,10 +185,10 @@ function TSHighlighter:on_detach()
end
---@package
---@param changes integer[][]?
---@param changes Range6[][]
function TSHighlighter:on_changedtree(changes)
for _, ch in ipairs(changes or {}) do
api.nvim__buf_redraw_range(self.bufnr, ch[1], ch[3] + 1)
for _, ch in ipairs(changes) do
api.nvim__buf_redraw_range(self.bufnr, ch[1], ch[4] + 1)
end
end