neovim

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

commit f57341a4b69398ff0c58686e66c2f4138be164aa
parent baba43681e792db30318bdedc3e73e4fe12482a6
Author: Quentin Rasmont <qrasmont@gmail.com>
Date:   Sun,  1 May 2022 21:13:47 +0200

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

Util from the nvim-treesitter project.

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

diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c @@ -90,6 +90,7 @@ static struct luaL_Reg node_meta[] = { { "prev_named_sibling", node_prev_named_sibling }, { "named_children", node_named_children }, { "root", node_root }, + { "byte_length", node_byte_length }, { NULL, NULL } }; @@ -1111,6 +1112,20 @@ static int node_root(lua_State *L) return 1; } +static int node_byte_length(lua_State *L) +{ + TSNode node; + if (!node_check(L, 1, &node)) { + return 0; + } + + uint32_t start_byte = ts_node_start_byte(node); + uint32_t end_byte = ts_node_end_byte(node); + + lua_pushnumber(L, end_byte - start_byte); + 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 @@ -92,4 +92,20 @@ describe('treesitter node API', function() eq(lua_eval('tostring(root)'), lua_eval('tostring(node:root())')) end) + + it('can compute the byte length of a node', function() + insert([[ + int main() { + int x = 3; + }]]) + + exec_lua([[ + tree = vim.treesitter.get_parser(0, "c"):parse()[1] + root = tree:root() + child = root:child(0):child(0) + ]]) + + eq(28, lua_eval('root:byte_length()')) + eq(3, lua_eval('child:byte_length()')) + end) end)