forLoopParts method
Abstract for-loop parts reference needed for collection for-elements.
Implementation
@override
Parser<Object> forLoopParts() => [
// Pattern for-in: for (var (a, b) in iterable)
seq3(
(ref0(varToken) | ref0(finalToken)) & ref0(outerPattern),
ref0(inToken),
ref0(expression),
).map3(
(p, _, iter) => ForPartsIn(pattern: p[1] as PatternNode, iterable: iter),
),
// Variable for-in: for (var x in iterable)
seq3(
ref0(variableDeclaration),
ref0(inToken),
ref0(expression),
).map3((decl, _, iter) => ForPartsIn(variable: decl, iterable: iter)),
// Identifier for-in: for (x in iterable)
seq3(ref0(identifier), ref0(inToken), ref0(expression)).map3(
(id, _, iter) => ForPartsIn(
variable: VariableDeclarationStatementNode(
variables: [VariableDeclaratorNode(name: id)],
),
iterable: iter,
),
),
// Traditional for: for (init; cond; updates)
seq5(
[
ref0(variableDeclarationStatement),
(ref0(expression).optional() & ref1(token, ';')).map(
(l) => l[0] != null
? ExpressionStatementNode(l[0] as ExpressionNode)
: null,
),
].toChoiceParser(),
ref0(expression).optional(),
ref1(token, ';'),
ref0(expression)
.plusSeparated(ref1(token, ','))
.map((l) => l.elements)
.optionalWith(const <ExpressionNode>[]),
epsilon(),
).map5(
(init, cond, _, updates, _) =>
ForPartsClassic(init: init, condition: cond, updates: updates),
),
].toChoiceParser();