Skip to content

Queries โ€‹

What you'll learn โ€‹

  • Compiling a query once and iterating captures.

Complete example โ€‹

examples/query.zig over total + price * count:

zig
var query = try parser.compileQuery("(identifier) @var");
defer query.deinit();

var cursor = parser.queryCursor();
defer cursor.deinit();
try cursor.execute(treesitter.expression_language, query.patterns(), query.nodes(), query.captureNames(), &tree);
while (cursor.nextMatch()) |m| {
    for (m.captures) |cap| {
        std.debug.print("@{s}: {s} [{d}, {d}]\n", .{ cap.name, cap.node.text(), cap.node.startByte(), cap.node.endByte() });
    }
}

Running the example โ€‹

sh
zig build run-query

Expected output โ€‹

text
@var: total [0, 5]
@var: price [8, 13]
@var: count [16, 21]

How it works โ€‹

The (identifier) pattern matches every named identifier node at any depth; each match carries one @var capture pointing at the node. Numbers and operators never match because the pattern names a specific named type.

Directives example โ€‹

examples/query_directives.zig shows #set! metadata, general directives, and the application helpers:

sh
zig build run-query_directives
text
setting: kind = variable
directive: select-adjacent! args=2
@x: foo
@x: bar
stripped: ' shopping'

API used โ€‹

Released under the MIT License.