Skip to content

Commit e7cb91c

Browse files
committed
foreach
1 parent 44a2bc9 commit e7cb91c

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

lute/std/libs/syntax/query.luau

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export type query<T = node> = {
1313
nodes: { T },
1414
filter: (self: query<T>, pred: (T) -> boolean) -> query<T>,
1515
replace: (self: query<T>, repl: (T) -> types.replacement?) -> types.replacements,
16-
map: <U>(self: query<T>, fn: (T) -> (U | { U })?) -> query<U>,
16+
map: <U>(self: query<T>, fn: (T) -> (U | { U })?) -> query<U>, -- recursion violation reported
17+
forEach: (self: query<T>, callback: (T) -> ()) -> (),
1718
}
1819

1920
local queryLib = {}
@@ -54,7 +55,13 @@ function queryLib.map<T, U>(self: query<T>, fn: (T) -> (U | { U })?): query<U>
5455
end
5556
end
5657
end
57-
return { nodes = newNodes, filter = self.filter, replace = self.replace, map = self.map }
58+
return { nodes = newNodes, filter = self.filter, replace = self.replace, map = self.map, forEach = self.forEach }
59+
end
60+
61+
function queryLib.forEach<T>(self: query<T>, callback: (T) -> ()): ()
62+
for _, node in self.nodes do
63+
callback(node)
64+
end
5865
end
5966

6067
function queryLib.select<T>(ast: node, fn: (node) -> (T | { T })?): query<T>
@@ -156,7 +163,13 @@ function queryLib.select<T>(ast: node, fn: (node) -> (T | { T })?): query<T>
156163
error("Unsupported node kind: " .. tostring(nodeKind))
157164
end
158165

159-
return { nodes = nodes, filter = queryLib.filter, replace = queryLib.replace, map = queryLib.map } -- LUAUFIX: queryLib.map has generics quantified at a different level than expected
166+
return {
167+
nodes = nodes,
168+
filter = queryLib.filter,
169+
replace = queryLib.replace,
170+
map = queryLib.map,
171+
forEach = queryLib.forEach,
172+
} -- LUAUFIX: queryLib.map has generics quantified at a different level than expected
160173
end
161174

162175
return table.freeze(queryLib)

tests/syntax/query.test.luau

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ local function mockQuery<T>(nodes: { T }): query.query<T>
99
nodes = nodes,
1010
filter = query.filter,
1111
replace = query.replace,
12+
forEach = query.forEach,
1213
map = query.map, -- LUAUFIX: should this subtype?
1314
}
1415
end
@@ -88,6 +89,21 @@ test.suite("AST Query", function(suite)
8889
assert.eq(mappedQuery.nodes[3], 40)
8990
end)
9091

92+
suite:case("forEach", function(assert)
93+
local testQuery = mockQuery({
94+
parser.parseexpr("0") :: luau.AstExprConstantNumber,
95+
parser.parseexpr("1") :: luau.AstExprConstantNumber,
96+
parser.parseexpr("2") :: luau.AstExprConstantNumber,
97+
})
98+
99+
local sum = 0
100+
testQuery:forEach(function(n: luau.AstExprConstantNumber)
101+
sum = sum + n.value
102+
end)
103+
104+
assert.eq(sum, 3) -- 0 + 1 + 2 = 3
105+
end)
106+
91107
suite:case("select_nums", function(assert)
92108
local ast = luau.parse("print(1 + 2)")
93109
local queryResult: query.query<luau.AstExprConstantNumber> = query.select(

0 commit comments

Comments
 (0)