aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/treesitter.lua
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/lua/vim/treesitter.lua')
-rw-r--r--runtime/lua/vim/treesitter.lua57
1 files changed, 23 insertions, 34 deletions
diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua
index baf47482a8..8d5cd2eeec 100644
--- a/runtime/lua/vim/treesitter.lua
+++ b/runtime/lua/vim/treesitter.lua
@@ -74,15 +74,21 @@ end
--- Returns the parser for a specific buffer and attaches it to the buffer
---
---- If needed, this will create the parser. If no parser can be found or created, returns `nil`.
+--- If needed, this will create the parser.
+---
+--- If no parser can be created, an error is thrown. Set `opts.error = false` to suppress this and
+--- return nil (and an error message) instead. WARNING: This behavior will become default in Nvim
+--- 0.12 and the option will be removed.
---
---@param bufnr (integer|nil) Buffer the parser should be tied to (default: current buffer)
---@param lang (string|nil) Language of this parser (default: from buffer filetype)
---@param opts (table|nil) Options to pass to the created language tree
---
----@return vim.treesitter.LanguageTree? object to use for parsing, or `nil` if not found
-function M._get_parser(bufnr, lang, opts)
+---@return vim.treesitter.LanguageTree? object to use for parsing
+---@return string? error message, if applicable
+function M.get_parser(bufnr, lang, opts)
opts = opts or {}
+ local should_error = opts.error == nil or opts.error
if bufnr == nil or bufnr == 0 then
bufnr = api.nvim_get_current_buf()
@@ -94,12 +100,22 @@ function M._get_parser(bufnr, lang, opts)
if not valid_lang(lang) then
if not parsers[bufnr] then
- return nil
+ local err_msg =
+ string.format('Parser not found for buffer %s: language could not be determined', bufnr)
+ if should_error then
+ error(err_msg)
+ end
+ return nil, err_msg
end
elseif parsers[bufnr] == nil or parsers[bufnr]:lang() ~= lang then
local parser = vim.F.npcall(M._create_parser, bufnr, lang, opts)
if not parser then
- return nil
+ local err_msg =
+ string.format('Parser could not be created for buffer %s and language "%s"', bufnr, lang)
+ if should_error then
+ error(err_msg)
+ end
+ return nil, err_msg
end
parsers[bufnr] = parser
end
@@ -109,29 +125,6 @@ function M._get_parser(bufnr, lang, opts)
return parsers[bufnr]
end
---- Returns the parser for a specific buffer and attaches it to the buffer
----
---- If needed, this will create the parser.
----
----@param bufnr (integer|nil) Buffer the parser should be tied to (default: current buffer)
----@param lang (string|nil) Language of this parser (default: from buffer filetype)
----@param opts (table|nil) Options to pass to the created language tree
----
----@return vim.treesitter.LanguageTree object to use for parsing
-function M.get_parser(bufnr, lang, opts)
- -- TODO(ribru17): Remove _get_parser and move that logic back here once the breaking function
- -- signature change is acceptable.
- local parser = M._get_parser(bufnr, lang, opts)
- if not parser then
- vim.notify_once(
- 'WARNING: vim.treesitter.get_parser will return nil instead of raising an error in Neovim 0.12',
- vim.log.levels.WARN
- )
- error('Parser not found.')
- end
- return parser
-end
-
--- Returns a string parser
---
---@param str string Text to parse
@@ -397,7 +390,7 @@ function M.get_node(opts)
local ts_range = { row, col, row, col }
- local root_lang_tree = M._get_parser(bufnr, opts.lang)
+ local root_lang_tree = M.get_parser(bufnr, opts.lang, { error = false })
if not root_lang_tree then
return
end
@@ -430,11 +423,7 @@ end
---@param lang (string|nil) Language of the parser (default: from buffer filetype)
function M.start(bufnr, lang)
bufnr = bufnr or api.nvim_get_current_buf()
- local parser = M._get_parser(bufnr, lang)
- if not parser then
- vim.notify('No parser for the given buffer.', vim.log.levels.WARN)
- return
- end
+ local parser = assert(M.get_parser(bufnr, lang, { error = false }))
M.highlighter.new(parser)
end