forLoopParts method

  1. @override
Parser<Object> forLoopParts()
inherited

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();