diff options
author | Riley Bruins <ribru17@hotmail.com> | 2024-09-14 12:57:33 -0700 |
---|---|---|
committer | Christian Clason <c.clason@uni-graz.at> | 2024-09-28 00:31:45 +0200 |
commit | 0f067cd34d09b38f9aaf2e1732d825e89b573077 (patch) | |
tree | 7caddf3ad6975ea08f82e6a05a25416c66697a1a | |
parent | 7b71fdbc1e9fcb71e642e67e0ac9a2711dd67df0 (diff) | |
download | rneovim-0f067cd34d09b38f9aaf2e1732d825e89b573077.tar.gz rneovim-0f067cd34d09b38f9aaf2e1732d825e89b573077.tar.bz2 rneovim-0f067cd34d09b38f9aaf2e1732d825e89b573077.zip |
fix(treesitter): suppress get_parser warnings via opts.error
-rw-r--r-- | runtime/doc/treesitter.txt | 10 | ||||
-rw-r--r-- | runtime/lua/vim/_comment.lua | 2 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter.lua | 57 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/_fold.lua | 4 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/_query_linter.lua | 2 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/dev.lua | 16 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/query.lua | 6 | ||||
-rw-r--r-- | runtime/lua/vim/vimhelp.lua | 2 | ||||
-rw-r--r-- | scripts/gen_help_html.lua | 2 | ||||
-rw-r--r-- | test/functional/lua/deprecated_spec.lua | 22 | ||||
-rw-r--r-- | test/functional/treesitter/language_spec.lua | 8 | ||||
-rw-r--r-- | test/functional/treesitter/parser_spec.lua | 2 |
12 files changed, 80 insertions, 53 deletions
diff --git a/runtime/doc/treesitter.txt b/runtime/doc/treesitter.txt index fea469e63b..21accda2a5 100644 --- a/runtime/doc/treesitter.txt +++ b/runtime/doc/treesitter.txt @@ -818,6 +818,11 @@ get_parser({bufnr}, {lang}, {opts}) *vim.treesitter.get_parser()* 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. + Parameters: ~ • {bufnr} (`integer?`) Buffer the parser should be tied to (default: current buffer) @@ -825,8 +830,9 @@ get_parser({bufnr}, {lang}, {opts}) *vim.treesitter.get_parser()* filetype) • {opts} (`table?`) Options to pass to the created language tree - Return: ~ - (`vim.treesitter.LanguageTree`) object to use for parsing + Return (multiple): ~ + (`vim.treesitter.LanguageTree?`) object to use for parsing + (`string?`) error message, if applicable get_range({node}, {source}, {metadata}) *vim.treesitter.get_range()* Get the range of a |TSNode|. Can also supply {source} and {metadata} to diff --git a/runtime/lua/vim/_comment.lua b/runtime/lua/vim/_comment.lua index c821f01257..de7f62632c 100644 --- a/runtime/lua/vim/_comment.lua +++ b/runtime/lua/vim/_comment.lua @@ -9,7 +9,7 @@ local function get_commentstring(ref_position) local buf_cs = vim.bo.commentstring - local ts_parser = vim.treesitter._get_parser() + local ts_parser = vim.treesitter.get_parser(0, '', { error = false }) if not ts_parser then return buf_cs end 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 diff --git a/runtime/lua/vim/treesitter/_fold.lua b/runtime/lua/vim/treesitter/_fold.lua index 49792c3891..7237d2e7d4 100644 --- a/runtime/lua/vim/treesitter/_fold.lua +++ b/runtime/lua/vim/treesitter/_fold.lua @@ -114,7 +114,7 @@ local function compute_folds_levels(bufnr, info, srow, erow, parse_injections) srow = srow or 0 erow = erow or api.nvim_buf_line_count(bufnr) - local parser = assert(ts._get_parser(bufnr)) + local parser = assert(ts.get_parser(bufnr, nil, { error = false })) parser:parse(parse_injections and { srow, erow } or nil) @@ -392,7 +392,7 @@ function M.foldexpr(lnum) lnum = lnum or vim.v.lnum local bufnr = api.nvim_get_current_buf() - local parser = ts._get_parser(bufnr) + local parser = ts.get_parser(bufnr, nil, { error = false }) if not parser then return '0' end diff --git a/runtime/lua/vim/treesitter/_query_linter.lua b/runtime/lua/vim/treesitter/_query_linter.lua index 417b8bafbb..632d045293 100644 --- a/runtime/lua/vim/treesitter/_query_linter.lua +++ b/runtime/lua/vim/treesitter/_query_linter.lua @@ -177,7 +177,7 @@ function M.lint(buf, opts) is_first_lang = i == 1, } - local parser = assert(vim.treesitter._get_parser(buf), 'query parser not found.') + local parser = assert(vim.treesitter.get_parser(buf, nil, { error = false })) parser:parse() parser:for_each_tree(function(tree, ltree) if ltree:lang() == 'query' then diff --git a/runtime/lua/vim/treesitter/dev.lua b/runtime/lua/vim/treesitter/dev.lua index 2a6e166ef1..dbf0e73250 100644 --- a/runtime/lua/vim/treesitter/dev.lua +++ b/runtime/lua/vim/treesitter/dev.lua @@ -76,9 +76,14 @@ end --- ---@package function TSTreeView:new(bufnr, lang) - local parser = vim.treesitter._get_parser(bufnr or 0, lang) + local parser = vim.treesitter.get_parser(bufnr or 0, lang, { error = false }) if not parser then - return nil, 'No parser available for the given buffer.' + return nil, + string.format( + 'Failed to create TSTreeView for buffer %s: no parser for lang "%s"', + bufnr, + lang + ) end -- For each child tree (injected language), find the root of the tree and locate the node within @@ -539,7 +544,7 @@ local edit_ns = api.nvim_create_namespace('treesitter/dev-edit') local function update_editor_highlights(query_win, base_win, lang) local base_buf = api.nvim_win_get_buf(base_win) local query_buf = api.nvim_win_get_buf(query_win) - local parser = assert(vim.treesitter._get_parser(base_buf, lang)) + local parser = assert(vim.treesitter.get_parser(base_buf, lang, { error = false })) api.nvim_buf_clear_namespace(base_buf, edit_ns, 0, -1) local query_content = table.concat(api.nvim_buf_get_lines(query_buf, 0, -1, false), '\n') @@ -596,9 +601,10 @@ function M.edit_query(lang) end vim.cmd(cmd) - local parser = vim.treesitter._get_parser(buf, lang) + local parser = vim.treesitter.get_parser(buf, lang, { error = false }) if not parser then - return nil, 'No parser available for the given buffer' + return nil, + string.format('Failed to show query editor for buffer %s: no parser for lang "%s"', buf, lang) end lang = parser:lang() diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua index bd0574b8b7..758c8bb356 100644 --- a/runtime/lua/vim/treesitter/query.lua +++ b/runtime/lua/vim/treesitter/query.lua @@ -1028,7 +1028,11 @@ end --- --- @param lang? string language to open the query editor for. If omitted, inferred from the current buffer's filetype. function M.edit(lang) - vim.treesitter.dev.edit_query(lang) + -- TODO(ribru17): Make edit_query return true upon success so we can just assert here + local _, err_msg = vim.treesitter.dev.edit_query(lang) + if err_msg then + error(err_msg) + end end return M diff --git a/runtime/lua/vim/vimhelp.lua b/runtime/lua/vim/vimhelp.lua index 01af5425c3..5579cc0174 100644 --- a/runtime/lua/vim/vimhelp.lua +++ b/runtime/lua/vim/vimhelp.lua @@ -33,7 +33,7 @@ end --- Show a table of contents for the help buffer in a loclist function M.show_toc() local bufnr = vim.api.nvim_get_current_buf() - local parser = assert(vim.treesitter._get_parser(bufnr, 'vimdoc'), 'vimdoc parser not found.') + local parser = assert(vim.treesitter.get_parser(bufnr, 'vimdoc', { error = false })) local query = vim.treesitter.query.parse( parser:lang(), [[ diff --git a/scripts/gen_help_html.lua b/scripts/gen_help_html.lua index f088f706d6..6751fd7ca7 100644 --- a/scripts/gen_help_html.lua +++ b/scripts/gen_help_html.lua @@ -802,7 +802,7 @@ local function parse_buf(fname, text, parser_path) if parser_path then vim.treesitter.language.add('vimdoc', { path = parser_path }) end - local lang_tree = assert(vim.treesitter._get_parser(buf), 'vimdoc parser not found.') + local lang_tree = assert(vim.treesitter.get_parser(buf, nil, { error = false })) return lang_tree, buf end diff --git a/test/functional/lua/deprecated_spec.lua b/test/functional/lua/deprecated_spec.lua new file mode 100644 index 0000000000..fee34336cc --- /dev/null +++ b/test/functional/lua/deprecated_spec.lua @@ -0,0 +1,22 @@ +local t = require('test.testutil') +local n = require('test.functional.testnvim')() + +local clear = n.clear +local exec_lua = n.exec_lua +local eq = t.eq + +describe('deprecated lua code', function() + before_each(clear) + + describe('vim.treesitter.get_parser()', function() + it('returns nil for versions >= 0.12', function() + local result = exec_lua(function() + if vim.version.ge(vim.version(), '0.12') then + return vim.treesitter.get_parser(0, 'borklang') + end + return nil + end) + eq(nil, result) + end) + end) +end) diff --git a/test/functional/treesitter/language_spec.lua b/test/functional/treesitter/language_spec.lua index f8191d603a..3947ab23b2 100644 --- a/test/functional/treesitter/language_spec.lua +++ b/test/functional/treesitter/language_spec.lua @@ -16,11 +16,11 @@ describe('treesitter language API', function() -- error tests not requiring a parser library it('handles missing language', function() eq( - '.../treesitter.lua:0: Parser not found.', + '.../treesitter.lua:0: Parser could not be created for buffer 1 and language "borklang"', pcall_err(exec_lua, "parser = vim.treesitter.get_parser(0, 'borklang')") ) - eq(NIL, exec_lua("return vim.treesitter._get_parser(0, 'borklang')")) + eq(NIL, exec_lua("return vim.treesitter.get_parser(0, 'borklang', { error = false })")) -- actual message depends on platform matches( @@ -108,10 +108,10 @@ describe('treesitter language API', function() command('set filetype=borklang') -- Should throw an error when filetype changes to borklang eq( - '.../treesitter.lua:0: Parser not found.', + '.../treesitter.lua:0: Parser could not be created for buffer 1 and language "borklang"', pcall_err(exec_lua, "new_parser = vim.treesitter.get_parser(0, 'borklang')") ) - eq(NIL, exec_lua("return vim.treesitter._get_parser(0, 'borklang')")) + eq(NIL, exec_lua("return vim.treesitter.get_parser(0, 'borklang', { error = false })")) end ) diff --git a/test/functional/treesitter/parser_spec.lua b/test/functional/treesitter/parser_spec.lua index 92379a71bd..c8829f4785 100644 --- a/test/functional/treesitter/parser_spec.lua +++ b/test/functional/treesitter/parser_spec.lua @@ -135,7 +135,7 @@ void ui_refresh(void) insert(test_text) eq( - '.../treesitter.lua:0: Parser not found.', + '.../treesitter.lua:0: Parser not found for buffer 1: language could not be determined', pcall_err(exec_lua, 'vim.treesitter.get_parser(0)') ) |