aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRiley Bruins <ribru17@hotmail.com>2024-06-14 17:54:10 -0700
committerChristian Clason <c.clason@uni-graz.at>2024-06-24 14:10:25 +0200
commitc57a85e0eda067ea28ca5853358947332aceecfd (patch)
treedb674dfec340ebc2a1e4d9c665841181e91e9aac /test
parent0a789a81821343c8287219b646c787435567a2be (diff)
downloadrneovim-c57a85e0eda067ea28ca5853358947332aceecfd.tar.gz
rneovim-c57a85e0eda067ea28ca5853358947332aceecfd.tar.bz2
rneovim-c57a85e0eda067ea28ca5853358947332aceecfd.zip
perf(treesitter): remove unnecessary foldexpr loop
Instead of looping over all captured nodes, just take the end range from the last node in the list. This uses the fact that nodes returned by iter_matches are ordered by their range (earlier to later).
Diffstat (limited to 'test')
-rw-r--r--test/functional/treesitter/query_spec.lua55
1 files changed, 55 insertions, 0 deletions
diff --git a/test/functional/treesitter/query_spec.lua b/test/functional/treesitter/query_spec.lua
index c3a376cd71..2212f787af 100644
--- a/test/functional/treesitter/query_spec.lua
+++ b/test/functional/treesitter/query_spec.lua
@@ -249,6 +249,61 @@ void ui_refresh(void)
}, res)
end)
+ it('returns quantified matches in order of range #29344', function()
+ insert([[
+ int main() {
+ int a, b, c, d, e, f, g, h, i;
+ a = MIN(0, 1);
+ b = MIN(0, 1);
+ c = MIN(0, 1);
+ d = MIN(0, 1);
+ e = MIN(0, 1);
+ f = MIN(0, 1);
+ g = MIN(0, 1);
+ h = MIN(0, 1);
+ i = MIN(0, 1);
+ }
+ ]])
+
+ local res = exec_lua(
+ [[
+ cquery = vim.treesitter.query.parse("c", ...)
+ parser = vim.treesitter.get_parser(0, "c")
+ tree = parser:parse()[1]
+ res = {}
+ for pattern, match in cquery:iter_matches(tree:root(), 0, 7, 14, { all = true }) do
+ -- can't transmit node over RPC. just check the name and range
+ local mrepr = {}
+ for cid, nodes in pairs(match) do
+ for _, node in ipairs(nodes) do
+ table.insert(mrepr, { '@' .. cquery.captures[cid], node:type(), node:range() })
+ end
+ end
+ table.insert(res, {pattern, mrepr})
+ end
+ return res
+ ]],
+ '(expression_statement (assignment_expression (call_expression)))+ @funccall'
+ )
+
+ eq({
+ {
+ 1,
+ {
+ { '@funccall', 'expression_statement', 2, 2, 2, 16 },
+ { '@funccall', 'expression_statement', 3, 2, 3, 16 },
+ { '@funccall', 'expression_statement', 4, 2, 4, 16 },
+ { '@funccall', 'expression_statement', 5, 2, 5, 16 },
+ { '@funccall', 'expression_statement', 6, 2, 6, 16 },
+ { '@funccall', 'expression_statement', 7, 2, 7, 16 },
+ { '@funccall', 'expression_statement', 8, 2, 8, 16 },
+ { '@funccall', 'expression_statement', 9, 2, 9, 16 },
+ { '@funccall', 'expression_statement', 10, 2, 10, 16 },
+ },
+ },
+ }, res)
+ end)
+
it('can match special regex characters like \\ * + ( with `vim-match?`', function()
insert('char* astring = "\\n"; (1 + 1) * 2 != 2;')