visitForStatement method
Visit a SForStatement.
Implementation
@override
Object? visitForStatement(SForStatement node) {
final loopParts = node.forLoopParts;
if (loopParts is SForPartsWithDeclarations) {
// Classic for loop: for (var i = 0; ... ; ...)
_executeClassicFor(
loopParts.variables,
loopParts.condition,
loopParts.updaters,
node.body!,
);
} else if (loopParts is SForPartsWithExpression) {
// Classic for loop: for (i = 0; ... ; ...)
_executeClassicFor(
loopParts.initialization,
loopParts.condition,
loopParts.updaters,
node.body!,
);
} else if (loopParts is SForEachPartsWithDeclaration) {
// For-in loop: for (var item in list) or await for (var item in stream)
if (loopParts.isAwait) {
// await for loop - expect Stream
return _executeAwaitForIn(
loopParts.loopVariable!,
loopParts.iterable!,
node.body!,
);
} else {
// Regular for-in loop - expect Iterable
_executeForIn(loopParts.loopVariable!, loopParts.iterable!, node.body!);
}
} else if (loopParts is SForEachPartsWithIdentifier) {
// For-in loop: for (item in list) or await for (item in stream)
if (loopParts.isAwait) {
// await for loop - expect Stream
return _executeAwaitForIn(
loopParts.identifier!,
loopParts.iterable!,
node.body!,
);
} else {
// Regular for-in loop - expect Iterable
_executeForIn(loopParts.identifier!, loopParts.iterable!, node.body!);
}
} else if (loopParts is SForEachPartsWithPattern) {
// Dart 3 record-pattern for-in:
// for (final (int i, String label) in list.indexed) { ... }
_executeForInWithPattern(
loopParts.pattern!,
loopParts.iterable!,
node.body!,
);
} else {
// Should not happen with valid Dart code
throw StateD4rtException(
'Unknown ForLoopParts type: ${loopParts.runtimeType}',
);
}
return null; // For loops don't produce a value
}