neovim

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

commit baba43681e792db30318bdedc3e73e4fe12482a6
parent a577fb778addb6eb305ade82a229b52673ced234
Author: Quentin Rasmont <qrasmont@gmail.com>
Date:   Sun,  1 May 2022 11:35:12 +0200

feat(treesitter): upstream get_root_for_node() as a node method

Util from the nvim-treesitter project.

Diffstat:
Msrc/nvim/lua/treesitter.c | 23+++++++++++++++++++++++
Mtest/functional/treesitter/node_spec.lua | 15+++++++++++++++
2 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c @@ -89,6 +89,8 @@ static struct luaL_Reg node_meta[] = { { "next_named_sibling", node_next_named_sibling }, { "prev_named_sibling", node_prev_named_sibling }, { "named_children", node_named_children }, + { "root", node_root }, + { NULL, NULL } }; @@ -1088,6 +1090,27 @@ static int node_named_children(lua_State *L) return 1; } +static int node_root(lua_State *L) +{ + TSNode parent; + TSNode result; + + TSNode node; + if (!node_check(L, 1, &node)) { + return 0; + } + parent = node; + result = node; + + while (!ts_node_is_null(parent)){ + result = parent; + parent = ts_node_parent(result); + } + + push_node(L, result, 1); + return 1; +} + /// assumes the match table being on top of the stack static void set_match(lua_State *L, TSQueryMatch *match, int nodeidx) { diff --git a/test/functional/treesitter/node_spec.lua b/test/functional/treesitter/node_spec.lua @@ -77,4 +77,19 @@ describe('treesitter node API', function() eq(3, len) eq('<node compound_statement>', lua_eval('tostring(children[3])')) end) + + it('can retrieve the tree root given a node', function() + insert([[ + int main() { + int x = 3; + }]]) + + exec_lua([[ + tree = vim.treesitter.get_parser(0, "c"):parse()[1] + root = tree:root() + node = root:child(0):child(2) + ]]) + + eq(lua_eval('tostring(root)'), lua_eval('tostring(node:root())')) + end) end)