From cf612c64b0fc87c399bc5c72735335c5e73d6de1 Mon Sep 17 00:00:00 2001 From: Jongwook Choi Date: Mon, 4 Dec 2023 04:00:49 -0500 Subject: fix(treesitter): allow passing lang to vim.treesitter.get_node() now correctly takes opts.lang (#26360) PROBLEM: `vim.treesitter.get_node()` does not recognize the `lang` in the option table. This option was used in somewhere else, for instance, `vim.treesitter.dev` (for `inspect_tree`) but was never implemented. SOLUTION: Make `get_node()` correctly use `opts.lang` when getting a treesitter parser. --- runtime/lua/vim/treesitter.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index e7a66c00b2..7b795380fe 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -362,6 +362,7 @@ end --- - bufnr integer|nil Buffer number (nil or 0 for current buffer) --- - pos table|nil 0-indexed (row, col) tuple. Defaults to cursor position in the --- current window. Required if {bufnr} is not the current buffer +--- - lang string|nil Parser language. (default: from buffer filetype) --- - ignore_injections boolean Ignore injected languages (default true) --- ---@return TSNode | nil Node at the given position @@ -392,7 +393,7 @@ function M.get_node(opts) local ts_range = { row, col, row, col } - local root_lang_tree = M.get_parser(bufnr) + local root_lang_tree = M.get_parser(bufnr, opts.lang) if not root_lang_tree then return end -- cgit From 617d1b28d6d3241199a9ea4f7e68b650549d3251 Mon Sep 17 00:00:00 2001 From: Phạm Huy Hoàng Date: Tue, 23 Jan 2024 18:06:54 +0900 Subject: fix(treesitter): prefix treesitter types with vim --- runtime/lua/vim/treesitter.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 7b795380fe..3c91be7acf 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -5,10 +5,10 @@ local Range = require('vim.treesitter._range') ---@type table local parsers = setmetatable({}, { __mode = 'v' }) ----@class TreesitterModule ----@field highlighter TSHighlighter ----@field query TSQueryModule ----@field language TSLanguageModule +---@class vim.treesitter +---@field highlighter vim.treesitter.highlighter +---@field query vim.treesitter.query +---@field language vim.treesitter.language local M = setmetatable({}, { __index = function(t, k) ---@diagnostic disable:no-unknown -- cgit From 0892c080d16776366a2fe289f9083cdc532ec56c Mon Sep 17 00:00:00 2001 From: Till Bungert Date: Sat, 27 Jan 2024 01:38:56 +0100 Subject: revert: "feat(treesitter): add foldtext with treesitter highlighting" This reverts commit 9ce1623 in favor of #20750. --- runtime/lua/vim/treesitter.lua | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 3c91be7acf..9d96ab33fa 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -517,16 +517,4 @@ function M.foldexpr(lnum) return require('vim.treesitter._fold').foldexpr(lnum) end ---- Returns the highlighted content of the first line of the fold or falls back to |foldtext()| ---- if no treesitter parser is found. Can be set directly to 'foldtext': ---- ---- ```lua ---- vim.wo.foldtext = 'v:lua.vim.treesitter.foldtext()' ---- ``` ---- ----@return { [1]: string, [2]: string[] }[] | string -function M.foldtext() - return require('vim.treesitter._fold').foldtext() -end - return M -- cgit From 2e982f1aad9f1a03562b7a451d642f76b04c37cb Mon Sep 17 00:00:00 2001 From: dundargoc Date: Mon, 22 Jan 2024 18:23:28 +0100 Subject: refactor: create function for deferred loading The benefit of this is that users only pay for what they use. If e.g. only `vim.lsp.buf_get_clients()` is called then they don't need to load all modules under `vim.lsp` which could lead to significant startuptime saving. Also `vim.lsp.module` is a bit nicer to user compared to `require("vim.lsp.module")`. This isn't used for some nested modules such as `filetype` as it breaks tests with error messages such as "attempt to index field 'detect'". It's not entirely certain the reason for this, but it is likely it is due to filetype being precompiled which would imply deferred loading isn't needed for performance reasons. --- runtime/lua/vim/treesitter.lua | 59 +++++++++++++----------------------------- 1 file changed, 18 insertions(+), 41 deletions(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 9d96ab33fa..88b68ff658 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -1,44 +1,21 @@ local api = vim.api -local LanguageTree = require('vim.treesitter.languagetree') -local Range = require('vim.treesitter._range') ---@type table local parsers = setmetatable({}, { __mode = 'v' }) ----@class vim.treesitter ----@field highlighter vim.treesitter.highlighter ----@field query vim.treesitter.query ----@field language vim.treesitter.language -local M = setmetatable({}, { - __index = function(t, k) - ---@diagnostic disable:no-unknown - if k == 'highlighter' then - t[k] = require('vim.treesitter.highlighter') - return t[k] - elseif k == 'language' then - t[k] = require('vim.treesitter.language') - return t[k] - elseif k == 'query' then - t[k] = require('vim.treesitter.query') - return t[k] - end - - local query = require('vim.treesitter.query') - if query[k] then - vim.deprecate('vim.treesitter.' .. k .. '()', 'vim.treesitter.query.' .. k .. '()', '0.10') - t[k] = query[k] - return t[k] - end - - local language = require('vim.treesitter.language') - if language[k] then - vim.deprecate('vim.treesitter.' .. k .. '()', 'vim.treesitter.language.' .. k .. '()', '0.10') - t[k] = language[k] - return t[k] - end - end, +local M = vim._defer_require('vim.treesitter', { + _fold = ..., --- @module 'vim.treesitter._fold' + _query_linter = ..., --- @module 'vim.treesitter._query_linter' + _range = ..., --- @module 'vim.treesitter._range' + dev = ..., --- @module 'vim.treesitter.dev' + highlighter = ..., --- @module 'vim.treesitter.highlighter' + language = ..., --- @module 'vim.treesitter.language' + languagetree = ..., --- @module 'vim.treesitter.languagetree' + query = ..., --- @module 'vim.treesitter.query' }) +local LanguageTree = M.languagetree + --- @nodoc M.language_version = vim._ts_get_language_version() @@ -200,7 +177,7 @@ end function M.get_range(node, source, metadata) if metadata and metadata.range then assert(source) - return Range.add_bytes(source, metadata.range) + return M._range.add_bytes(source, metadata.range) end return { node:range(true) } end @@ -209,7 +186,7 @@ end ---@param range Range ---@returns string local function buf_range_get_text(buf, range) - local start_row, start_col, end_row, end_col = Range.unpack4(range) + local start_row, start_col, end_row, end_col = M._range.unpack4(range) if end_col == 0 then if start_row == end_row then start_col = -1 @@ -237,7 +214,7 @@ function M.get_node_text(node, source, opts) if metadata.text then return metadata.text elseif type(source) == 'number' then - local range = vim.treesitter.get_range(node, source, metadata) + local range = M.get_range(node, source, metadata) return buf_range_get_text(source, range) end @@ -266,9 +243,9 @@ function M.node_contains(node, range) vim.validate({ -- allow a table so nodes can be mocked node = { node, { 'userdata', 'table' } }, - range = { range, Range.validate, 'integer list with 4 or 6 elements' }, + range = { range, M._range.validate, 'integer list with 4 or 6 elements' }, }) - return Range.contains({ node:range() }, range) + return M._range.contains({ node:range() }, range) end --- Returns a list of highlight captures at the given position @@ -502,7 +479,7 @@ end --- argument and should return a string. function M.inspect_tree(opts) ---@diagnostic disable-next-line: invisible - require('vim.treesitter.dev').inspect_tree(opts) + M.dev.inspect_tree(opts) end --- Returns the fold level for {lnum} in the current buffer. Can be set directly to 'foldexpr': @@ -514,7 +491,7 @@ end ---@param lnum integer|nil Line number to calculate fold level for ---@return string function M.foldexpr(lnum) - return require('vim.treesitter._fold').foldexpr(lnum) + return M._fold.foldexpr(lnum) end return M -- cgit From bb15fa035610bb9765ca16900703804a88faa3bb Mon Sep 17 00:00:00 2001 From: 再生花 Date: Fri, 23 Feb 2024 05:58:59 +0900 Subject: feat(treesitter): add folding for `InspectTree` (#27518) As the InspectTree buffer is now a valid tree-sitter query tree, we can use the bundled fold queries to have folding for the tree. --- runtime/lua/vim/treesitter.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 88b68ff658..2aa46ceebd 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -461,7 +461,8 @@ end --- --- While in the window, press "a" to toggle display of anonymous nodes, "I" to toggle the --- display of the source language of each node, "o" to toggle the query editor, and press ---- to jump to the node under the cursor in the source buffer. +--- to jump to the node under the cursor in the source buffer. Folding also works +--- (try |zo|, |zc|, etc.). --- --- Can also be shown with `:InspectTree`. *:InspectTree* --- -- cgit From 185752614d1a4906c8f218e4c24c3b52bbe6560e Mon Sep 17 00:00:00 2001 From: Maria José Solano Date: Sun, 18 Feb 2024 18:46:19 -0800 Subject: refactor(types): fix miscellaneous type warnings --- runtime/lua/vim/treesitter.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 2aa46ceebd..e2197168f0 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -294,6 +294,7 @@ function M.get_captures_at_pos(bufnr, row, col) for capture, node, metadata in iter do if M.is_in_node_range(node, row, col) then + ---@diagnostic disable-next-line: invisible local c = q._query.captures[capture] -- name of the capture in the query if c ~= nil then table.insert(matches, { capture = c, metadata = metadata, lang = tree:lang() }) @@ -325,6 +326,12 @@ function M.get_captures_at_cursor(winnr) return captures end +--- @class vim.treesitter.GetNodeOpts +--- @field bufnr integer? +--- @field pos { [1]: integer, [2]: integer }? +--- @field lang string? +--- @field ignore_injections boolean? + --- Returns the smallest named node at the given position --- --- NOTE: Calling this on an unparsed tree can yield an invalid node. @@ -335,7 +342,7 @@ end --- vim.treesitter.get_parser(bufnr):parse(range) --- ``` --- ----@param opts table|nil Optional keyword arguments: +---@param opts vim.treesitter.GetNodeOpts? Optional keyword arguments: --- - bufnr integer|nil Buffer number (nil or 0 for current buffer) --- - pos table|nil 0-indexed (row, col) tuple. Defaults to cursor position in the --- current window. Required if {bufnr} is not the current buffer @@ -352,7 +359,7 @@ function M.get_node(opts) bufnr = api.nvim_get_current_buf() end - local row, col + local row, col --- @type integer, integer if opts.pos then assert(#opts.pos == 2, 'Position must be a (row, col) tuple') row, col = opts.pos[1], opts.pos[2] -- cgit From 9beb40a4db5613601fc1a4b828a44e5977eca046 Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Thu, 15 Feb 2024 17:16:04 +0000 Subject: feat(docs): replace lua2dox.lua Problem: The documentation flow (`gen_vimdoc.py`) has several issues: - it's not very versatile - depends on doxygen - doesn't work well with Lua code as it requires an awkward filter script to convert it into pseudo-C. - The intermediate XML files and filters makes it too much like a rube goldberg machine. Solution: Re-implement the flow using Lua, LPEG and treesitter. - `gen_vimdoc.py` is now replaced with `gen_vimdoc.lua` and replicates a portion of the logic. - `lua2dox.lua` is gone! - No more XML files. - Doxygen is now longer used and instead we now use: - LPEG for comment parsing (see `scripts/luacats_grammar.lua` and `scripts/cdoc_grammar.lua`). - LPEG for C parsing (see `scripts/cdoc_parser.lua`) - Lua patterns for Lua parsing (see `scripts/luacats_parser.lua`). - Treesitter for Markdown parsing (see `scripts/text_utils.lua`). - The generated `runtime/doc/*.mpack` files have been removed. - `scripts/gen_eval_files.lua` now instead uses `scripts/cdoc_parser.lua` directly. - Text wrapping is implemented in `scripts/text_utils.lua` and appears to produce more consistent results (the main contributer to the diff of this change). --- runtime/lua/vim/treesitter.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index e2197168f0..9b69f95f54 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -432,7 +432,7 @@ end --- Can be used in an ftplugin or FileType autocommand. --- --- Note: By default, disables regex syntax highlighting, which may be required for some plugins. ---- In this case, add ``vim.bo.syntax = 'on'`` after the call to `start`. +--- In this case, add `vim.bo.syntax = 'on'` after the call to `start`. --- --- Example: --- -- cgit From a5fe8f59d98398d04bed8586cee73864bbcdde92 Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Tue, 27 Feb 2024 15:20:32 +0000 Subject: docs: improve/add documentation of Lua types - Added `@inlinedoc` so single use Lua types can be inlined into the functions docs. E.g. ```lua --- @class myopts --- @inlinedoc --- --- Documentation for some field --- @field somefield integer --- @param opts myOpts function foo(opts) end ``` Will be rendered as ``` foo(opts) Parameters: - {opts} (table) Object with the fields: - somefield (integer) Documentation for some field ``` - Marked many classes with with `@nodoc` or `(private)`. We can eventually introduce these when we want to. --- runtime/lua/vim/treesitter.lua | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 9b69f95f54..61c5d66958 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -1,6 +1,6 @@ local api = vim.api ----@type table +---@type table local parsers = setmetatable({}, { __mode = 'v' }) local M = vim._defer_require('vim.treesitter', { @@ -30,7 +30,7 @@ M.minimum_language_version = vim._ts_get_minimum_language_version() ---@param lang string Language of the parser ---@param opts (table|nil) Options to pass to the created language tree --- ----@return LanguageTree object to use for parsing +---@return vim.treesitter.LanguageTree object to use for parsing function M._create_parser(bufnr, lang, opts) if bufnr == 0 then bufnr = vim.api.nvim_get_current_buf() @@ -80,7 +80,7 @@ end ---@param lang (string|nil) Filetype of this parser (default: buffer filetype) ---@param opts (table|nil) Options to pass to the created language tree --- ----@return LanguageTree object to use for parsing +---@return vim.treesitter.LanguageTree object to use for parsing function M.get_parser(bufnr, lang, opts) opts = opts or {} @@ -119,7 +119,7 @@ end ---@param lang string Language of this string ---@param opts (table|nil) Options to pass to the created language tree --- ----@return LanguageTree object to use for parsing +---@return vim.treesitter.LanguageTree object to use for parsing function M.get_string_parser(str, lang, opts) vim.validate({ str = { str, 'string' }, @@ -172,7 +172,7 @@ end ---to get the range with directives applied. ---@param node TSNode ---@param source integer|string|nil Buffer or string from which the {node} is extracted ----@param metadata TSMetadata|nil +---@param metadata vim.treesitter.query.TSMetadata|nil ---@return Range6 function M.get_range(node, source, metadata) if metadata and metadata.range then @@ -326,10 +326,21 @@ function M.get_captures_at_cursor(winnr) return captures end ---- @class vim.treesitter.GetNodeOpts +--- Optional keyword arguments: +--- @class vim.treesitter.get_node.Opts +--- @inlinedoc +--- +--- Buffer number (nil or 0 for current buffer) --- @field bufnr integer? +--- +--- 0-indexed (row, col) tuple. Defaults to cursor position in the +--- current window. Required if {bufnr} is not the current buffer --- @field pos { [1]: integer, [2]: integer }? +--- +--- Parser language. (default: from buffer filetype) --- @field lang string? +--- +--- Ignore injected languages (default true) --- @field ignore_injections boolean? --- Returns the smallest named node at the given position @@ -342,12 +353,7 @@ end --- vim.treesitter.get_parser(bufnr):parse(range) --- ``` --- ----@param opts vim.treesitter.GetNodeOpts? Optional keyword arguments: ---- - bufnr integer|nil Buffer number (nil or 0 for current buffer) ---- - pos table|nil 0-indexed (row, col) tuple. Defaults to cursor position in the ---- current window. Required if {bufnr} is not the current buffer ---- - lang string|nil Parser language. (default: from buffer filetype) ---- - ignore_injections boolean Ignore injected languages (default true) +---@param opts vim.treesitter.get_node.Opts? --- ---@return TSNode | nil Node at the given position function M.get_node(opts) -- cgit From 3c572a31a3bb7009b4ad8eac56da1458acae3b75 Mon Sep 17 00:00:00 2001 From: Yi Ming Date: Sat, 2 Mar 2024 14:29:41 +0000 Subject: docs(treesitter): fix ambiguous parameter description about `lang` --- runtime/lua/vim/treesitter.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 61c5d66958..7cfebd2c00 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -77,7 +77,7 @@ end --- 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) Filetype of this parser (default: buffer filetype) +---@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 @@ -452,7 +452,7 @@ end --- ``` --- ---@param bufnr (integer|nil) Buffer to be highlighted (default: current buffer) ----@param lang (string|nil) Language of the parser (default: buffer filetype) +---@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) @@ -480,8 +480,8 @@ end --- Can also be shown with `:InspectTree`. *:InspectTree* --- ---@param opts table|nil Optional options table with the following possible keys: ---- - lang (string|nil): The language of the source buffer. If omitted, the ---- filetype of the source buffer is used. +--- - lang (string|nil): The language of the source buffer. If omitted, detect +--- from the filetype of the source buffer. --- - bufnr (integer|nil): Buffer to draw the tree into. If omitted, a new --- buffer is created. --- - winid (integer|nil): Window id to display the tree buffer in. If omitted, -- cgit From 649dd00fe2e54183cc210f24d36504a61e5ea605 Mon Sep 17 00:00:00 2001 From: dundargoc Date: Fri, 8 Mar 2024 11:23:17 +0100 Subject: feat!: remove deprecated functions --- runtime/lua/vim/treesitter.lua | 42 ------------------------------------------ 1 file changed, 42 deletions(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 7cfebd2c00..d1215885d8 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -391,48 +391,6 @@ function M.get_node(opts) return root_lang_tree:named_node_for_range(ts_range, opts) end ---- Returns the smallest named node at the given position ---- ----@param bufnr integer Buffer number (0 for current buffer) ----@param row integer Position row ----@param col integer Position column ----@param opts table Optional keyword arguments: ---- - lang string|nil Parser language ---- - ignore_injections boolean Ignore injected languages (default true) ---- ----@return TSNode | nil Node at the given position ----@deprecated -function M.get_node_at_pos(bufnr, row, col, opts) - vim.deprecate('vim.treesitter.get_node_at_pos()', 'vim.treesitter.get_node()', '0.10') - if bufnr == 0 then - bufnr = api.nvim_get_current_buf() - end - local ts_range = { row, col, row, col } - - opts = opts or {} - - local root_lang_tree = M.get_parser(bufnr, opts.lang) - if not root_lang_tree then - return - end - - return root_lang_tree:named_node_for_range(ts_range, opts) -end - ---- Returns the smallest named node under the cursor ---- ----@param winnr (integer|nil) Window handle or 0 for current window (default) ---- ----@return string Name of node under the cursor ----@deprecated -function M.get_node_at_cursor(winnr) - vim.deprecate('vim.treesitter.get_node_at_cursor()', 'vim.treesitter.get_node():type()', '0.10') - winnr = winnr or 0 - local bufnr = api.nvim_win_get_buf(winnr) - - return M.get_node({ bufnr = bufnr, ignore_injections = false }):type() -end - --- Starts treesitter highlighting for a buffer --- --- Can be used in an ftplugin or FileType autocommand. -- cgit From ade1b12f49c3b3914c74847d791eb90ea90b56b7 Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 8 Mar 2024 12:25:18 +0000 Subject: docs: support inline markdown - Tags are now created with `[tag]()` - References are now created with `[tag]` - Code spans are no longer wrapped --- runtime/lua/vim/treesitter.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'runtime/lua/vim/treesitter.lua') diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index d1215885d8..a09619f369 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -432,10 +432,10 @@ end --- --- While in the window, press "a" to toggle display of anonymous nodes, "I" to toggle the --- display of the source language of each node, "o" to toggle the query editor, and press ---- to jump to the node under the cursor in the source buffer. Folding also works +--- [] to jump to the node under the cursor in the source buffer. Folding also works --- (try |zo|, |zc|, etc.). --- ---- Can also be shown with `:InspectTree`. *:InspectTree* +--- Can also be shown with `:InspectTree`. [:InspectTree]() --- ---@param opts table|nil Optional options table with the following possible keys: --- - lang (string|nil): The language of the source buffer. If omitted, detect -- cgit