visitSequence method

  1. @override
void visitSequence(
  1. SequenceState node
)
override

Visits the SequenceState node.

Implementation

@override
void visitSequence(SequenceState node) {
  final children = node.states.toList();
  var canReject = false;
  for (var i = 0; i < children.length; i++) {
    final child = children[i];
    State? surrogate;
    if (i < children.length - 1) {
      if (!child.hasSingleOutput) {
        surrogate = mux(child);
      }
    }

    if (surrogate != null) {
      surrogate.accept(this);
      child.source = surrogate.source;
    } else {
      child.accept(this);
    }

    if (_canReject(child)) {
      canReject = true;
    }
  }

  final last = children.last;
  var source = last.source;
  source = source.replaceAll(State.rejectPlaceholder, '');
  last.source = source;
  for (var i = children.length - 2; i >= 0; i--) {
    final child = children[i];
    if (!_canAccept(child)) {
      warning('''
The 'Sequence' state element #$i does not define an 'acceptance' placeholder.
State element #$i source:
${child.source}''');
    }

    child.renderAcceptance(source);
    child.source = child.source.replaceAll(State.rejectPlaceholder, '');
    source = child.source;
  }

  if (canReject) {
    source = '''
$source
${State.rejectPlaceholder}''';
  }

  node.source = _removeEmptyLines(source);
  _notify(node);
}