fix(treesitter): make vim.treesitter.stop() detach parser

This commit is contained in:
zeertzjq 2024-07-01 17:51:12 +08:00
parent 12c9791e0f
commit faff7681ca
2 changed files with 21 additions and 0 deletions

View File

@ -41,10 +41,16 @@ function M._create_parser(bufnr, lang, opts)
local self = LanguageTree.new(bufnr, lang, opts)
local function bytes_cb(_, ...)
if self:_is_destroyed() then
return true
end
self:_on_bytes(...)
end
local function detach_cb(_, ...)
if self:_is_destroyed() then
return true
end
if parsers[bufnr] == self then
parsers[bufnr] = nil
end
@ -52,6 +58,9 @@ function M._create_parser(bufnr, lang, opts)
end
local function reload_cb(_)
if self:_is_destroyed() then
return true
end
self:_on_reload()
end
@ -426,6 +435,11 @@ function M.stop(bufnr)
if M.highlighter.active[bufnr] then
M.highlighter.active[bufnr]:destroy()
end
if parsers[bufnr] then
parsers[bufnr]:destroy()
parsers[bufnr] = nil
end
end
--- Open a window that displays a textual representation of the nodes in the language tree.

View File

@ -86,6 +86,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 boolean|table<integer,boolean> If the parsed tree is valid
---@field private _destroyed boolean If the LanguageTree has been destroyed
---@field private _logger? fun(logtype: string, msg: string)
---@field private _logfile? file*
local LanguageTree = {}
@ -534,6 +535,12 @@ function LanguageTree:destroy()
for _, child in pairs(self._children) do
child:destroy()
end
self._destroyed = true
end
---@nodoc
function LanguageTree:_is_destroyed()
return self._destroyed
end
---@param region Range6[]