visitForStatement method

  1. @override
Object? visitForStatement(
  1. ForStatement node
)
override

Implementation

@override
Object? visitForStatement(ForStatement node) {
  final loopParts = node.forLoopParts;

  if (loopParts is ForPartsWithDeclarations) {
    // Classic for loop: for (var i = 0; ... ; ...)
    _executeClassicFor(loopParts.variables, loopParts.condition,
        loopParts.updaters, node.body);
  } else if (loopParts is ForPartsWithExpression) {
    // Classic for loop: for (i = 0; ... ; ...)
    _executeClassicFor(loopParts.initialization, loopParts.condition,
        loopParts.updaters, node.body);
  } else if (loopParts is ForEachPartsWithDeclaration) {
    // For-in loop: for (var item in list) or await for (var item in stream)
    if (node.awaitKeyword != null) {
      // 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 ForEachPartsWithIdentifier) {
    // For-in loop: for (item in list) or await for (item in stream)
    if (node.awaitKeyword != null) {
      // 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 {
    // Should not happen with valid Dart code
    throw StateD4rtException(
        'Unknown ForLoopParts type: ${loopParts.runtimeType}');
  }

  return null; // For loops don't produce a value
}