neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 1af55bfcf21b9bc7594b9c5ee0c2f60cbb887654
parent bd3b6ec8360e0dd6edfe74c3d0013fd2b98b989e
Author: Riley Bruins <ribru17@hotmail.com>
Date:   Sun, 28 Jul 2024 13:30:33 -0700

feat(treesitter): allow get_node to return anonymous nodes

Adds a new field `include_anonymous` to the `get_node` options to allow
anonymous nodes to be returned.

Diffstat:
Mruntime/doc/news.txt | 2++
Mruntime/doc/treesitter.txt | 2++
Mruntime/lua/vim/treesitter.lua | 6++++++
Mtest/functional/treesitter/node_spec.lua | 17+++++++++++++++++
4 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt @@ -167,6 +167,8 @@ TERMINAL TREESITTER • |LanguageTree:node_for_range()| gets anonymous and named nodes for a range +• |vim.treesitter.get_node()| now takes an option `include_anonymous`, default + false, which allows it to return anonymous nodes as well as named nodes. TUI diff --git a/runtime/doc/treesitter.txt b/runtime/doc/treesitter.txt @@ -773,6 +773,8 @@ get_node({opts}) *vim.treesitter.get_node()* filetype) • {ignore_injections} (`boolean?`) Ignore injected languages (default true) + • {include_anonymous} (`boolean?`) Include anonymous nodes + (default false) Return: ~ (`TSNode?`) Node at the given position diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua @@ -342,6 +342,9 @@ end --- --- Ignore injected languages (default true) --- @field ignore_injections boolean? +--- +--- Include anonymous nodes (default false) +--- @field include_anonymous boolean? --- Returns the smallest named node at the given position --- @@ -388,6 +391,9 @@ function M.get_node(opts) return end + if opts.include_anonymous then + return root_lang_tree:node_for_range(ts_range, opts) + end return root_lang_tree:named_node_for_range(ts_range, opts) end diff --git a/test/functional/treesitter/node_spec.lua b/test/functional/treesitter/node_spec.lua @@ -55,6 +55,23 @@ describe('treesitter node API', function() eq('identifier', lua_eval('node:type()')) end) + it('get_node() with anonymous nodes included', function() + insert([[print('test')]]) + + exec_lua([[ + parser = vim.treesitter.get_parser(0, 'lua') + tree = parser:parse()[1] + node = vim.treesitter.get_node({ + bufnr = 0, + pos = { 0, 6 }, -- on the first apostrophe + include_anonymous = true, + }) + ]]) + + eq("'", lua_eval('node:type()')) + eq(false, lua_eval('node:named()')) + end) + it('can move between siblings', function() insert([[ int main(int x, int y, int z) {