fix(treesitter): nil access when running string parser async

This commit is contained in:
Riley Bruins
2025-01-30 13:34:46 -08:00
committed by Christian Clason
parent f3381a8b64
commit 096ae3bfd7
2 changed files with 23 additions and 9 deletions

View File

@@ -476,21 +476,26 @@ function LanguageTree:_async_parse(range, on_parse)
end end
local source = self._source local source = self._source
local buf = vim.b[source] local is_buffer_parser = type(source) == 'number'
local ct = buf.changedtick local buf = is_buffer_parser and vim.b[source] or nil
local ct = is_buffer_parser and buf.changedtick or nil
local total_parse_time = 0 local total_parse_time = 0
local redrawtime = vim.o.redrawtime local redrawtime = vim.o.redrawtime
local timeout = not vim.g._ts_force_sync_parsing and default_parse_timeout_ms or nil local timeout = not vim.g._ts_force_sync_parsing and default_parse_timeout_ms or nil
local function step() local function step()
if type(source) == 'number' and not vim.api.nvim_buf_is_valid(source) then if is_buffer_parser then
return nil if
end not vim.api.nvim_buf_is_valid(source --[[@as number]])
then
return nil
end
-- If buffer was changed in the middle of parsing, reset parse state -- If buffer was changed in the middle of parsing, reset parse state
if buf.changedtick ~= ct then if buf.changedtick ~= ct then
ct = buf.changedtick ct = buf.changedtick
total_parse_time = 0 total_parse_time = 0
end
end end
local parse_time, trees, finished = tcall(self._parse, self, range, timeout) local parse_time, trees, finished = tcall(self._parse, self, range, timeout)

View File

@@ -504,6 +504,15 @@ end]]
eq({ 0, 0, 0, 13 }, ret) eq({ 0, 0, 0, 13 }, ret)
end) end)
it('can run async parses with string parsers', function()
local ret = exec_lua(function()
local parser = vim.treesitter.get_string_parser('int foo = 42;', 'c')
return { parser:parse(nil, function() end)[1]:root():range() }
end)
eq({ 0, 0, 0, 13 }, ret)
end)
it('allows to run queries with string parsers', function() it('allows to run queries with string parsers', function()
local txt = [[ local txt = [[
int foo = 42; int foo = 42;