mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	fix(treesitter)!: enforce buffer is loaded when creating parser
Problem: `vim.treesitter._create_parser()` silently loads the buffer,
          bypassing the swapfile prompt.
Solution: Error for an unloaded buffer, ensure buffer is loaded in
          `vim.treesitter.start()` instead.
			
			
This commit is contained in:
		
				
					committed by
					
						
						Christian Clason
					
				
			
			
				
	
			
			
			
						parent
						
							a422f3393e
						
					
				
				
					commit
					a0b52e7cb3
				
			@@ -175,6 +175,7 @@ TREESITTER
 | 
				
			|||||||
  the tree before returning. Scripts must call |LanguageTree:parse()| explicitly. >lua
 | 
					  the tree before returning. Scripts must call |LanguageTree:parse()| explicitly. >lua
 | 
				
			||||||
    local p = vim.treesitter.get_parser(0, 'c')
 | 
					    local p = vim.treesitter.get_parser(0, 'c')
 | 
				
			||||||
    p:parse()
 | 
					    p:parse()
 | 
				
			||||||
 | 
					• |vim.treesitter.get_parser()| expects its buffer to be loaded.
 | 
				
			||||||
<
 | 
					<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TUI
 | 
					TUI
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,8 +34,6 @@ M.minimum_language_version = vim._ts_get_minimum_language_version()
 | 
				
			|||||||
function M._create_parser(bufnr, lang, opts)
 | 
					function M._create_parser(bufnr, lang, opts)
 | 
				
			||||||
  bufnr = vim._resolve_bufnr(bufnr)
 | 
					  bufnr = vim._resolve_bufnr(bufnr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  vim.fn.bufload(bufnr)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  local self = LanguageTree.new(bufnr, lang, opts)
 | 
					  local self = LanguageTree.new(bufnr, lang, opts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local function bytes_cb(_, ...)
 | 
					  local function bytes_cb(_, ...)
 | 
				
			||||||
@@ -102,6 +100,9 @@ function M.get_parser(bufnr, lang, opts)
 | 
				
			|||||||
      return nil, err_msg
 | 
					      return nil, err_msg
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  elseif parsers[bufnr] == nil or parsers[bufnr]:lang() ~= lang then
 | 
					  elseif parsers[bufnr] == nil or parsers[bufnr]:lang() ~= lang then
 | 
				
			||||||
 | 
					    if not api.nvim_buf_is_loaded(bufnr) then
 | 
				
			||||||
 | 
					      error(('Buffer %s must be loaded to create parser'):format(bufnr))
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
    local parser = vim.F.npcall(M._create_parser, bufnr, lang, opts)
 | 
					    local parser = vim.F.npcall(M._create_parser, bufnr, lang, opts)
 | 
				
			||||||
    if not parser then
 | 
					    if not parser then
 | 
				
			||||||
      local err_msg =
 | 
					      local err_msg =
 | 
				
			||||||
@@ -415,6 +416,14 @@ end
 | 
				
			|||||||
---@param lang string? Language of the parser (default: from buffer filetype)
 | 
					---@param lang string? Language of the parser (default: from buffer filetype)
 | 
				
			||||||
function M.start(bufnr, lang)
 | 
					function M.start(bufnr, lang)
 | 
				
			||||||
  bufnr = vim._resolve_bufnr(bufnr)
 | 
					  bufnr = vim._resolve_bufnr(bufnr)
 | 
				
			||||||
 | 
					  -- Ensure buffer is loaded. `:edit` over `bufload()` to show swapfile prompt.
 | 
				
			||||||
 | 
					  if not api.nvim_buf_is_loaded(bufnr) then
 | 
				
			||||||
 | 
					    if api.nvim_buf_get_name(bufnr) ~= '' then
 | 
				
			||||||
 | 
					      pcall(api.nvim_buf_call, bufnr, vim.cmd.edit)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      vim.fn.bufload(bufnr)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
  local parser = assert(M.get_parser(bufnr, lang, { error = false }))
 | 
					  local parser = assert(M.get_parser(bufnr, lang, { error = false }))
 | 
				
			||||||
  M.highlighter.new(parser)
 | 
					  M.highlighter.new(parser)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user