diff options
author | Riley Bruins <ribru17@hotmail.com> | 2025-01-30 13:34:46 -0800 |
---|---|---|
committer | Christian Clason <ch.clason+github@icloud.com> | 2025-02-01 17:02:52 +0100 |
commit | 096ae3bfd7075dce69c70182ccedcd6d33e66d31 (patch) | |
tree | c606ef585a427d4010ea507fb44a7a269f6f95e4 | |
parent | f3381a8b64befece6055f1993b7bff029f281e02 (diff) | |
download | rneovim-096ae3bfd7075dce69c70182ccedcd6d33e66d31.tar.gz rneovim-096ae3bfd7075dce69c70182ccedcd6d33e66d31.tar.bz2 rneovim-096ae3bfd7075dce69c70182ccedcd6d33e66d31.zip |
fix(treesitter): nil access when running string parser async
-rw-r--r-- | runtime/lua/vim/treesitter/languagetree.lua | 23 | ||||
-rw-r--r-- | test/functional/treesitter/parser_spec.lua | 9 |
2 files changed, 23 insertions, 9 deletions
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua index 1f7872715f..4e4da5a5ec 100644 --- a/runtime/lua/vim/treesitter/languagetree.lua +++ b/runtime/lua/vim/treesitter/languagetree.lua @@ -476,21 +476,26 @@ function LanguageTree:_async_parse(range, on_parse) end local source = self._source - local buf = vim.b[source] - local ct = buf.changedtick + local is_buffer_parser = type(source) == 'number' + 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 redrawtime = vim.o.redrawtime local timeout = not vim.g._ts_force_sync_parsing and default_parse_timeout_ms or nil local function step() - if type(source) == 'number' and not vim.api.nvim_buf_is_valid(source) then - return nil - end + if is_buffer_parser then + if + 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 buf.changedtick ~= ct then - ct = buf.changedtick - total_parse_time = 0 + -- If buffer was changed in the middle of parsing, reset parse state + if buf.changedtick ~= ct then + ct = buf.changedtick + total_parse_time = 0 + end end local parse_time, trees, finished = tcall(self._parse, self, range, timeout) diff --git a/test/functional/treesitter/parser_spec.lua b/test/functional/treesitter/parser_spec.lua index 825c2b8f29..a6d3a340f7 100644 --- a/test/functional/treesitter/parser_spec.lua +++ b/test/functional/treesitter/parser_spec.lua @@ -504,6 +504,15 @@ end]] eq({ 0, 0, 0, 13 }, ret) 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() local txt = [[ int foo = 42; |