visitOneOrMore method

  1. @override
ExpressionGenerator visitOneOrMore(
  1. OneOrMoreExpression node
)
inherited

Implementation

@override
ExpressionGenerator visitOneOrMore(OneOrMoreExpression node) {
  final g = ExpressionGenerator(node);
  g.generate = (block) {
    g.declareVariable(block);
    final child = node.expression;
    g.variables = {};
    if (g.variable == null) {
      final count = g.allocate();
      block.assignVar(count, literal(0));
      block.doWhile$(ref(Members.ok), (block) {
        final g1 = acceptChild(child, g);
        g1.generate(block);
        final inc = postfixExpression(ref(count), '++');
        block.addStatement(inc);
      });

      block.assign(Members.ok, ref(count).notEqualTo(literal(1)));
    } else {
      void fail(CodeBlock block) {
        block.break$();
      }

      final init = literalList([], ref(child.resultType));
      final list = g.allocate();
      block.assignFinal(list, init);
      block.while$(true$, (block) {
        final g1 = acceptChild(child, g);
        g1.generate(block);
        generatePostCode(g1, block, null, fail);
        final element = nullCheck(ref(g1.variable!), child.resultType);
        final args = [element];
        final call = methodCallExpression(ref(list), 'add', args);
        block.addStatement(call);
      });

      final control = ref(list).property('isNotEmpty');
      block.if$(control, (block) {
        block.assign(g.variable!, ref(list));
        block.assign(Members.ok, true$);
      });
    }
  };

  return g;
}