refactor(treesitter): drop LanguageTree._has_regions #32274

This simplifies some logic in `languagetree.lua`, removing the need for
`_has_regions`, and removing side effects in `:included_regions()`.

Before:
- Edit is made which sets `_regions = nil`
- Upon the next call to `included_regions()` (usually right after we
  marked `_regions` as `nil` due to an `_iter_regions()` call), if
  `_regions` is nil, we repopulate the table (as long as the tree
  actually has regions)

After:
- Edit is made which resets `_regions` if it exists
- `included_regions()` no longer needs to perform this logic itself, and
  also no longer needs to read a `_has_regions` variable
This commit is contained in:
Riley Bruins
2025-02-02 03:42:47 -08:00
committed by GitHub
parent 48e3ac60c6
commit 02ea0e77a1

View File

@@ -82,7 +82,6 @@ local TSCallbackNames = {
---@field private _ranges_being_parsed table<string, boolean> ---@field private _ranges_being_parsed table<string, boolean>
---Table of callback queues, keyed by each region for which the callbacks should be run ---Table of callback queues, keyed by each region for which the callbacks should be run
---@field private _cb_queues table<string, fun(err?: string, trees?: table<integer, TSTree>)[]> ---@field private _cb_queues table<string, fun(err?: string, trees?: table<integer, TSTree>)[]>
---@field private _has_regions boolean
---@field private _regions table<integer, Range6[]>? ---@field private _regions table<integer, Range6[]>?
---List of regions this tree should manage and parse. If nil then regions are ---List of regions this tree should manage and parse. If nil then regions are
---taken from _trees. This is mostly a short-lived cache for included_regions() ---taken from _trees. This is mostly a short-lived cache for included_regions()
@@ -132,7 +131,6 @@ function LanguageTree.new(source, lang, opts)
_opts = opts, _opts = opts,
_injection_query = injections[lang] and query.parse(lang, injections[lang]) _injection_query = injections[lang] and query.parse(lang, injections[lang])
or query.get(lang, 'injections'), or query.get(lang, 'injections'),
_has_regions = false,
_injections_processed = false, _injections_processed = false,
_valid = false, _valid = false,
_parser = vim._create_ts_parser(lang), _parser = vim._create_ts_parser(lang),
@@ -743,8 +741,6 @@ end
---@private ---@private
---@param new_regions (Range4|Range6|TSNode)[][] List of regions this tree should manage and parse. ---@param new_regions (Range4|Range6|TSNode)[][] List of regions this tree should manage and parse.
function LanguageTree:set_included_regions(new_regions) function LanguageTree:set_included_regions(new_regions)
self._has_regions = true
-- Transform the tables from 4 element long to 6 element long (with byte offset) -- Transform the tables from 4 element long to 6 element long (with byte offset)
for _, region in ipairs(new_regions) do for _, region in ipairs(new_regions) do
for i, range in ipairs(region) do for i, range in ipairs(region) do
@@ -788,20 +784,10 @@ function LanguageTree:included_regions()
return self._regions return self._regions
end end
if not self._has_regions then
-- treesitter.c will default empty ranges to { -1, -1, -1, -1, -1, -1} (the full range) -- treesitter.c will default empty ranges to { -1, -1, -1, -1, -1, -1} (the full range)
return { {} } return { {} }
end end
local regions = {} ---@type Range6[][]
for i, _ in pairs(self._trees) do
regions[i] = self._trees[i]:included_ranges(true)
end
self._regions = regions
return regions
end
---@param node TSNode ---@param node TSNode
---@param source string|integer ---@param source string|integer
---@param metadata vim.treesitter.query.TSMetadata ---@param metadata vim.treesitter.query.TSMetadata
@@ -1050,7 +1036,14 @@ function LanguageTree:_edit(
end end
self._parser:reset() self._parser:reset()
self._regions = nil
if self._regions then
local regions = {} ---@type table<integer, Range6[]>
for i, tree in pairs(self._trees) do
regions[i] = tree:included_ranges(true)
end
self._regions = regions
end
local changed_range = { local changed_range = {
start_row, start_row,