fix(treesitter): fixup language invalidation (#22381)

This commit is contained in:
Lewis Russell
2023-02-23 18:09:44 +00:00
committed by GitHub
parent 1df3f5ec6a
commit 3f35ebb14d

View File

@@ -27,7 +27,7 @@ local Range = require('vim.treesitter._range')
---@field private _lang string Language name ---@field private _lang string Language name
---@field private _source (integer|string) Buffer or string to parse ---@field private _source (integer|string) Buffer or string to parse
---@field private _trees TSTree[] Reference to parsed tree (one for each language) ---@field private _trees TSTree[] Reference to parsed tree (one for each language)
---@field private _valid boolean|table<integer,true> If the parsed tree is valid ---@field private _valid boolean|table<integer,boolean> If the parsed tree is valid
--- TODO(lewis6991): combine _regions, _valid and _trees --- TODO(lewis6991): combine _regions, _valid and _trees
---@field private _is_child boolean ---@field private _is_child boolean
local LanguageTree = {} local LanguageTree = {}
@@ -115,10 +115,18 @@ end
--- If the tree is invalid, call `parse()`. --- If the tree is invalid, call `parse()`.
--- This will return the updated tree. --- This will return the updated tree.
function LanguageTree:is_valid() function LanguageTree:is_valid()
if type(self._valid) == 'table' then local valid = self._valid
return #self._valid == #self._regions
if type(valid) == 'table' then
for _, v in ipairs(valid) do
if not v then
return false
end
end
return true
end end
return self._valid
return valid
end end
--- Returns a map of language to child tree. --- Returns a map of language to child tree.
@@ -323,11 +331,17 @@ function LanguageTree:set_included_regions(regions)
elseif self._valid ~= false then elseif self._valid ~= false then
if self._valid == true then if self._valid == true then
self._valid = {} self._valid = {}
for i = 1, #regions do
self._valid[i] = true
end
end end
for i = 1, #regions do for i = 1, #regions do
self._valid[i] = true
if not vim.deep_equal(self._regions[i], regions[i]) then if not vim.deep_equal(self._regions[i], regions[i]) then
self._valid[i] = nil self._valid[i] = false
end
if not self._valid[i] then
self._trees[i] = nil self._trees[i] = nil
end end
end end
@@ -491,16 +505,16 @@ end
---@param regions Range6[][] ---@param regions Range6[][]
---@param old_range Range6 ---@param old_range Range6
---@param new_range Range6 ---@param new_range Range6
---@return table<integer, true> region indices to invalidate ---@return table<integer,boolean> region indices to invalidate
local function update_regions(regions, old_range, new_range) local function update_regions(regions, old_range, new_range)
---@type table<integer,true> ---@type table<integer,boolean>
local valid = {} local valid = {}
for i, ranges in ipairs(regions or {}) do for i, ranges in ipairs(regions or {}) do
valid[i] = true valid[i] = true
for j, r in ipairs(ranges) do for j, r in ipairs(ranges) do
if Range.intercepts(r, old_range) then if Range.intercepts(r, old_range) then
valid[i] = nil valid[i] = false
break break
end end
@@ -572,12 +586,10 @@ function LanguageTree:_on_bytes(
start_byte + new_byte, start_byte + new_byte,
} }
local valid_regions = update_regions(self._regions, old_range, new_range) if #self._regions == 0 then
if #self._regions == 0 or #valid_regions == 0 then
self._valid = false self._valid = false
else else
self._valid = valid_regions self._valid = update_regions(self._regions, old_range, new_range)
end end
for _, child in pairs(self._children) do for _, child in pairs(self._children) do