mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	fix(treesitter): nil access when running string parser async
This commit is contained in:
		
				
					committed by
					
						
						Christian Clason
					
				
			
			
				
	
			
			
			
						parent
						
							f3381a8b64
						
					
				
				
					commit
					096ae3bfd7
				
			@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user