aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2023-02-23 18:09:44 +0000
committerGitHub <noreply@github.com>2023-02-23 18:09:44 +0000
commit3f35ebb14dd8b1ceeef45c4f42949f14e3b54b88 (patch)
tree71980476cc3291d2e1c23f148613c7fd50f9ce29
parent1df3f5ec6aca24cbe7b78ead5c37ad06a65c84e8 (diff)
downloadrneovim-3f35ebb14dd8b1ceeef45c4f42949f14e3b54b88.tar.gz
rneovim-3f35ebb14dd8b1ceeef45c4f42949f14e3b54b88.tar.bz2
rneovim-3f35ebb14dd8b1ceeef45c4f42949f14e3b54b88.zip
fix(treesitter): fixup language invalidation (#22381)
-rw-r--r--runtime/lua/vim/treesitter/languagetree.lua38
1 files changed, 25 insertions, 13 deletions
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua
index 2d4e2e595b..122496cff3 100644
--- a/runtime/lua/vim/treesitter/languagetree.lua
+++ b/runtime/lua/vim/treesitter/languagetree.lua
@@ -27,7 +27,7 @@ local Range = require('vim.treesitter._range')
---@field private _lang string Language name
---@field private _source (integer|string) Buffer or string to parse
---@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
---@field private _is_child boolean
local LanguageTree = {}
@@ -115,10 +115,18 @@ end
--- If the tree is invalid, call `parse()`.
--- This will return the updated tree.
function LanguageTree:is_valid()
- if type(self._valid) == 'table' then
- return #self._valid == #self._regions
+ local valid = self._valid
+
+ if type(valid) == 'table' then
+ for _, v in ipairs(valid) do
+ if not v then
+ return false
+ end
+ end
+ return true
end
- return self._valid
+
+ return valid
end
--- Returns a map of language to child tree.
@@ -323,11 +331,17 @@ function LanguageTree:set_included_regions(regions)
elseif self._valid ~= false then
if self._valid == true then
self._valid = {}
+ for i = 1, #regions do
+ self._valid[i] = true
+ end
end
+
for i = 1, #regions do
- self._valid[i] = true
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
end
end
@@ -491,16 +505,16 @@ end
---@param regions Range6[][]
---@param old_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)
- ---@type table<integer,true>
+ ---@type table<integer,boolean>
local valid = {}
for i, ranges in ipairs(regions or {}) do
valid[i] = true
for j, r in ipairs(ranges) do
if Range.intercepts(r, old_range) then
- valid[i] = nil
+ valid[i] = false
break
end
@@ -572,12 +586,10 @@ function LanguageTree:_on_bytes(
start_byte + new_byte,
}
- local valid_regions = update_regions(self._regions, old_range, new_range)
-
- if #self._regions == 0 or #valid_regions == 0 then
+ if #self._regions == 0 then
self._valid = false
else
- self._valid = valid_regions
+ self._valid = update_regions(self._regions, old_range, new_range)
end
for _, child in pairs(self._children) do