diff options
author | Lewis Russell <lewis6991@gmail.com> | 2023-03-03 09:44:02 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-03 09:44:02 +0000 |
commit | 6d4f48182131c36d57589eefd4cefe3c70256d04 (patch) | |
tree | 70dcc65f33ea46d15c7f0d728cfdec074aa7d43a | |
parent | 89cccea167ab8d3db6601a410dcbd33eb3824947 (diff) | |
download | rneovim-6d4f48182131c36d57589eefd4cefe3c70256d04.tar.gz rneovim-6d4f48182131c36d57589eefd4cefe3c70256d04.tar.bz2 rneovim-6d4f48182131c36d57589eefd4cefe3c70256d04.zip |
fix(treesitter): disallow empty filetypes
Fixes #22473
-rw-r--r-- | runtime/lua/vim/treesitter.lua | 3 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/language.lua | 10 | ||||
-rw-r--r-- | test/functional/treesitter/language_spec.lua | 7 | ||||
-rw-r--r-- | test/functional/treesitter/parser_spec.lua | 14 |
4 files changed, 31 insertions, 3 deletions
diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 09e3814a17..f80da433b1 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -47,7 +47,8 @@ function M._create_parser(bufnr, lang, opts) vim.fn.bufload(bufnr) - language.add(lang, { filetype = vim.bo[bufnr].filetype }) + local ft = vim.bo[bufnr].filetype + language.add(lang, { filetype = ft ~= '' and ft or nil }) local self = LanguageTree.new(bufnr, lang, opts) diff --git a/runtime/lua/vim/treesitter/language.lua b/runtime/lua/vim/treesitter/language.lua index 5bcc786e88..5f34d9cd56 100644 --- a/runtime/lua/vim/treesitter/language.lua +++ b/runtime/lua/vim/treesitter/language.lua @@ -60,6 +60,16 @@ function M.add(lang, opts) filetype = { filetype, { 'string', 'table' }, true }, }) + if filetype == '' then + error(string.format("'%s' is not a valid filetype", filetype)) + elseif type(filetype) == 'table' then + for _, f in ipairs(filetype) do + if f == '' then + error(string.format("'%s' is not a valid filetype", filetype)) + end + end + end + M.register(lang, filetype or lang) if vim._ts_has_language(lang) then diff --git a/test/functional/treesitter/language_spec.lua b/test/functional/treesitter/language_spec.lua index 2cf18242ff..747aea54b7 100644 --- a/test/functional/treesitter/language_spec.lua +++ b/test/functional/treesitter/language_spec.lua @@ -33,7 +33,12 @@ describe('treesitter language API', function() it('shows error for invalid language name', function() eq(".../language.lua:0: '/foo/' is not a valid language name", - pcall_err(exec_lua, 'vim.treesitter.add("/foo/", nil, false)')) + pcall_err(exec_lua, 'vim.treesitter.add("/foo/")')) + end) + + it('shows error for invalid filetype', function() + eq('.../language.lua:0: \'\' is not a valid filetype', + pcall_err(exec_lua, [[vim.treesitter.add('foo', { filetype = '' })]])) end) it('inspects language', function() diff --git a/test/functional/treesitter/parser_spec.lua b/test/functional/treesitter/parser_spec.lua index fd9822d1c0..27f2e81ab2 100644 --- a/test/functional/treesitter/parser_spec.lua +++ b/test/functional/treesitter/parser_spec.lua @@ -4,6 +4,7 @@ local clear = helpers.clear local eq = helpers.eq local insert = helpers.insert local exec_lua = helpers.exec_lua +local pcall_err = helpers.pcall_err local feed = helpers.feed local is_os = helpers.is_os local skip = helpers.skip @@ -124,6 +125,16 @@ void ui_refresh(void) }, res) end) + it('does not get parser for empty filetype', function() + insert(test_text); + + eq(".../language.lua:0: '' is not a valid filetype", + pcall_err(exec_lua, 'vim.treesitter.get_parser(0)')) + + -- Must provide language for buffers with an empty filetype + exec_lua("vim.treesitter.get_parser(0, 'c')") + end) + it('allows to get a child by field', function() insert(test_text); @@ -874,9 +885,10 @@ int x = INT_MAX; it("can fold via foldexpr", function() insert(test_text) - exec_lua([[vim.treesitter.get_parser(0, "c")]]) local levels = exec_lua([[ + vim.opt.filetype = 'c' + vim.treesitter.get_parser(0, "c") local res = {} for i = 1, vim.api.nvim_buf_line_count(0) do res[i] = vim.treesitter.foldexpr(i) |