mirror of
https://github.com/neovim/neovim
synced 2025-07-20 12:02:29 +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