visitForStatement method

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

Implementation

@override
Object? visitForStatement(ForStatement node) {
  final labels = _labelsOf(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,
      labels,
    );
  } else if (loopParts is ForPartsWithExpression) {
    // Classic for loop: for (i = 0; ... ; ...)
    _executeClassicFor(
      loopParts.initialization,
      loopParts.condition,
      loopParts.updaters,
      node.body,
      labels,
    );
  } 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,
        labels,
      );
    } else {
      // Regular for-in loop - expect Iterable
      _executeForIn(
        loopParts.loopVariable,
        loopParts.iterable,
        node.body,
        labels,
      );
    }
  } 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,
        labels,
      );
    } else {
      // Regular for-in loop - expect Iterable
      _executeForIn(
        loopParts.identifier,
        loopParts.iterable,
        node.body,
        labels,
      );
    }
  } else if (loopParts is ForEachPartsWithPattern) {
    // Dart 3 record-pattern for-in:
    //   for (final (int i, String label) in list.indexed) { ... }
    _executeForInWithPattern(
      loopParts.pattern,
      loopParts.iterable,
      node.body,
      labels,
    );
  } else {
    // Should not happen with valid Dart code
    throw StateD4rtException(
      'Unknown ForLoopParts type: ${loopParts.runtimeType}',
    );
  }

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