mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
fix(treesitter): fixup language invalidation (#22381)
This commit is contained in:
@@ -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
|
||||||
|
Reference in New Issue
Block a user