diff options
-rw-r--r-- | runtime/doc/news.txt | 6 | ||||
-rw-r--r-- | runtime/doc/treesitter.txt | 12 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter.lua | 2 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/_query_linter.lua | 2 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter/language.lua | 26 |
5 files changed, 31 insertions, 17 deletions
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt index 11e0129f52..77345e6b19 100644 --- a/runtime/doc/news.txt +++ b/runtime/doc/news.txt @@ -98,6 +98,12 @@ TREESITTER backwards compatibility, an option `all=false` (only return the last matching node) is provided that will be removed in a future release. +• |vim.treesitter.language.get_filetypes()| always includes the {language} + argument in addition to explicitly registered filetypes. + +• |vim.treesitter.language.get_lang()| falls back to the {filetype} argument + if no languages are explicitly registered. + TUI • TODO diff --git a/runtime/doc/treesitter.txt b/runtime/doc/treesitter.txt index da2e8db8c9..e0f7536712 100644 --- a/runtime/doc/treesitter.txt +++ b/runtime/doc/treesitter.txt @@ -969,14 +969,15 @@ add({lang}, {opts}) *vim.treesitter.language.add()* Parameters: ~ • {lang} (`string`) Name of the parser (alphanumerical and `_` only) • {opts} (`table?`) Options: - • {filetype}? (`string|string[]`, default: {lang}) Default - filetype the parser should be associated with. • {path}? (`string`) Optional path the parser is located at • {symbol_name}? (`string`) Internal symbol name for the language to load get_filetypes({lang}) *vim.treesitter.language.get_filetypes()* - Get the filetypes associated with the parser named {lang}. + Returns the filetypes for which a parser named {lang} is used. + + The list includes {lang} itself plus all filetypes registered via + |vim.treesitter.language.register()|. Parameters: ~ • {lang} (`string`) Name of parser @@ -985,6 +986,11 @@ get_filetypes({lang}) *vim.treesitter.language.get_filetypes()* (`string[]`) filetypes get_lang({filetype}) *vim.treesitter.language.get_lang()* + Returns the language name to be used when loading a parser for {filetype}. + + If no language has been explicitly registered via + |vim.treesitter.language.register()|, default to {filetype}. For composite + filetypes like `html.glimmer`, only the main filetype is returned. Parameters: ~ • {filetype} (`string`) diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index c21e0aff07..de52685220 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -95,7 +95,7 @@ function M.get_parser(bufnr, lang, opts) end if not valid_lang(lang) then - lang = M.language.get_lang(vim.bo[bufnr].filetype) or vim.bo[bufnr].filetype + lang = M.language.get_lang(vim.bo[bufnr].filetype) end if not valid_lang(lang) then diff --git a/runtime/lua/vim/treesitter/_query_linter.lua b/runtime/lua/vim/treesitter/_query_linter.lua index 632d045293..c5e4b86e1e 100644 --- a/runtime/lua/vim/treesitter/_query_linter.lua +++ b/runtime/lua/vim/treesitter/_query_linter.lua @@ -41,7 +41,7 @@ local function guess_query_lang(buf) local filename = api.nvim_buf_get_name(buf) if filename ~= '' then local resolved_filename = vim.F.npcall(vim.fn.fnamemodify, filename, ':p:h:t') - return resolved_filename and vim.treesitter.language.get_lang(resolved_filename) or nil + return resolved_filename and vim.treesitter.language.get_lang(resolved_filename) end end diff --git a/runtime/lua/vim/treesitter/language.lua b/runtime/lua/vim/treesitter/language.lua index e31ce6cb59..e4e1c2fff0 100644 --- a/runtime/lua/vim/treesitter/language.lua +++ b/runtime/lua/vim/treesitter/language.lua @@ -7,11 +7,15 @@ local ft_to_lang = { help = 'vimdoc', } ---- Get the filetypes associated with the parser named {lang}. +--- Returns the filetypes for which a parser named {lang} is used. +--- +--- The list includes {lang} itself plus all filetypes registered via +--- |vim.treesitter.language.register()|. +--- --- @param lang string Name of parser --- @return string[] filetypes function M.get_filetypes(lang) - local r = {} ---@type string[] + local r = { lang } ---@type string[] for ft, p in pairs(ft_to_lang) do if p == lang then r[#r + 1] = ft @@ -20,6 +24,12 @@ function M.get_filetypes(lang) return r end +--- Returns the language name to be used when loading a parser for {filetype}. +--- +--- If no language has been explicitly registered via |vim.treesitter.language.register()|, +--- default to {filetype}. For composite filetypes like `html.glimmer`, only the main filetype is +--- returned. +--- --- @param filetype string --- @return string|nil function M.get_lang(filetype) @@ -29,9 +39,9 @@ function M.get_lang(filetype) if ft_to_lang[filetype] then return ft_to_lang[filetype] end - -- support subfiletypes like html.glimmer + -- for subfiletypes like html.glimmer use only "main" filetype filetype = vim.split(filetype, '.', { plain = true })[1] - return ft_to_lang[filetype] + return ft_to_lang[filetype] or filetype end ---@deprecated @@ -59,10 +69,6 @@ end ---@class vim.treesitter.language.add.Opts ---@inlinedoc --- ----Default filetype the parser should be associated with. ----(Default: {lang}) ----@field filetype? string|string[] ---- ---Optional path the parser is located at ---@field path? string --- @@ -78,21 +84,18 @@ end function M.add(lang, opts) opts = opts or {} local path = opts.path - local filetype = opts.filetype or lang local symbol_name = opts.symbol_name vim.validate({ lang = { lang, 'string' }, path = { path, 'string', true }, symbol_name = { symbol_name, 'string', true }, - filetype = { filetype, { 'string', 'table' }, true }, }) -- parser names are assumed to be lowercase (consistent behavior on case-insensitive file systems) lang = lang:lower() if vim._ts_has_language(lang) then - M.register(lang, filetype) return end @@ -117,7 +120,6 @@ function M.add(lang, opts) else vim._ts_add_language_from_object(path, lang, symbol_name) end - M.register(lang, filetype) end --- @param x string|string[] |