visitSequence method
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);
}