visitForStatement method

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

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
}