generateSequence method

ExpressionGenerator generateSequence(
  1. SequenceExpression node,
  2. int startIndex
)
inherited

Implementation

ExpressionGenerator generateSequence(
    SequenceExpression node, int startIndex) {
  final g = ExpressionGenerator(node);
  g.generate = (block) {
    g.declareVariable(block);
    final expressions = node.expressions;
    final localVariables = <String?>[];
    final semanticVariables = <String?>[];
    final types = <String>[];
    final generators = <ExpressionGenerator>[];
    final active = expressions.where((e) => e.variable != null);
    var activeIndex = -1;
    if (node.actionSource == null) {
      if (active.isEmpty) {
        activeIndex = 0;
      } else if (active.length == 1) {
        activeIndex = active.first.index!;
      }
    }

    var succesBlock = block;
    for (var i = 0; i < expressions.length; i++) {
      final child = expressions[i];
      final g1 = acceptChild(child, g);
      generators.add(g1);
      if (i == 0) {
        g1.addVariables(g);
      }

      if (i == activeIndex) {
        if (child.resultUsed) {
          g1.variable = g.variable;
          g1.isVariableDeclared = g.isVariableDeclared;
        }
      }

      if (i > 0 && !expressions[i - 1].isOptional) {
        succesBlock.if$(ref(Members.ok), (block) {
          succesBlock = block;
          g1.generate(block);
        });
      } else {
        g1.generate(succesBlock);
      }

      localVariables.add(g1.variable);
      semanticVariables.add(child.variable);
      types.add(child.resultType);
    }

    generateSequenceAction(node, succesBlock, g,
        localVariables: localVariables,
        semanticVariables: semanticVariables,
        types: types);
  };

  return g;
}