mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +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:
		 Luuk van Baal
					Luuk van Baal
				
			
				
					committed by
					
						 Christian Clason
						Christian Clason
					
				
			
			
				
	
			
			
			 Christian Clason
						Christian Clason
					
				
			
						parent
						
							a422f3393e
						
					
				
				
					commit
					a0b52e7cb3
				
			| @@ -175,6 +175,7 @@ TREESITTER | ||||
|   the tree before returning. Scripts must call |LanguageTree:parse()| explicitly. >lua | ||||
|     local p = vim.treesitter.get_parser(0, 'c') | ||||
|     p:parse() | ||||
| • |vim.treesitter.get_parser()| expects its buffer to be loaded. | ||||
| < | ||||
|  | ||||
| TUI | ||||
|   | ||||
| @@ -34,8 +34,6 @@ M.minimum_language_version = vim._ts_get_minimum_language_version() | ||||
| function M._create_parser(bufnr, lang, opts) | ||||
|   bufnr = vim._resolve_bufnr(bufnr) | ||||
|  | ||||
|   vim.fn.bufload(bufnr) | ||||
|  | ||||
|   local self = LanguageTree.new(bufnr, lang, opts) | ||||
|  | ||||
|   local function bytes_cb(_, ...) | ||||
| @@ -102,6 +100,9 @@ function M.get_parser(bufnr, lang, opts) | ||||
|       return nil, err_msg | ||||
|     end | ||||
|   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) | ||||
|     if not parser then | ||||
|       local err_msg = | ||||
| @@ -415,6 +416,14 @@ end | ||||
| ---@param lang string? Language of the parser (default: from buffer filetype) | ||||
| function M.start(bufnr, lang) | ||||
|   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 })) | ||||
|   M.highlighter.new(parser) | ||||
| end | ||||
|   | ||||
		Reference in New Issue
	
	Block a user