aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiley Bruins <ribru17@hotmail.com>2025-02-16 09:02:53 -0800
committerLewis Russell <me@lewisr.dev>2025-02-17 15:13:26 +0000
commit1827ab7a1f9a0232e0824f91210ca09f7667c828 (patch)
tree50d05518514a7f105d27771d2b1653bda32e0995
parentb360c0608556232c8ddb7ecc9cd26e68584bee76 (diff)
downloadrneovim-1827ab7a1f9a0232e0824f91210ca09f7667c828.tar.gz
rneovim-1827ab7a1f9a0232e0824f91210ca09f7667c828.tar.bz2
rneovim-1827ab7a1f9a0232e0824f91210ca09f7667c828.zip
fix(treesitter): separately track the number of valid regions
We need to add a separate variable to keep track of this information, since we cannot read the length of the valid regions table itself, since it has holes.
-rw-r--r--runtime/lua/vim/treesitter/languagetree.lua9
1 files changed, 6 insertions, 3 deletions
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua
index d8db489d54..ac7c08b0f8 100644
--- a/runtime/lua/vim/treesitter/languagetree.lua
+++ b/runtime/lua/vim/treesitter/languagetree.lua
@@ -95,6 +95,7 @@ local TSCallbackNames = {
---@field private _trees table<integer, TSTree> Reference to parsed tree (one for each language).
---Each key is the index of region, which is synced with _regions and _valid.
---@field private _valid_regions table<integer,true> Set of valid region IDs.
+---@field private _num_valid_regions integer Number of valid regions
---@field private _is_entirely_valid boolean Whether the entire tree (excluding children) is valid.
---@field private _logger? fun(logtype: string, msg: string)
---@field private _logfile? file*
@@ -138,6 +139,7 @@ function LanguageTree.new(source, lang, opts)
or query.get(lang, 'injections'),
_injections_processed = false,
_valid_regions = {},
+ _num_valid_regions = 0,
_num_regions = 1,
_is_entirely_valid = false,
_parser = vim._create_ts_parser(lang),
@@ -246,6 +248,7 @@ end
---@param reload boolean|nil
function LanguageTree:invalidate(reload)
self._valid_regions = {}
+ self._num_valid_regions = 0
self._is_entirely_valid = false
self._parser:reset()
@@ -401,10 +404,9 @@ function LanguageTree:_parse_regions(range, thread_state)
total_parse_time = total_parse_time + parse_time
no_regions_parsed = no_regions_parsed + 1
self._valid_regions[i] = true
+ self._num_valid_regions = self._num_valid_regions + 1
- -- _valid_regions can have holes, but that is okay because this equality is only true when it
- -- has no holes (meaning all regions are valid)
- if #self._valid_regions == self._num_regions then
+ if self._num_valid_regions == self._num_regions then
self._is_entirely_valid = true
end
end
@@ -745,6 +747,7 @@ function LanguageTree:_iter_regions(fn)
-- just by checking the length of _valid_regions.
self._valid_regions[i] = fn(i, region) and true or nil
if not self._valid_regions[i] then
+ self._num_valid_regions = self._num_valid_regions - 1
self:_log(function()
return 'invalidating region', i, region_tostr(region)
end)