visitForStmt method

  1. @override
void visitForStmt(
  1. ForExpr node
)
override

Implementation

@override
void visitForStmt(ForExpr node) {
  final userDecl = node.init;
  VarDecl? initializer;
  BlockStmt loop = node.loop;
  final markedSymbols = <String, String>{};
  if (userDecl != null) {
    final markedVariable = _context.optimization.loopBindings[node]!.first;
    final markedId = '${_lexicon.internalPrefix}${userDecl.id.id}';
    markedSymbols[userDecl.id.id] = markedId;
    initializer = _record(
      VarDecl(
        _context.declarationIdentifier(markedId, markedVariable, userDecl.id),
        initializer: userDecl.initializer,
        isMutable: userDecl.isMutable,
        source: userDecl.source,
        line: userDecl.line,
        column: userDecl.column,
        offset: userDecl.offset,
        length: userDecl.length,
      ),
      userDecl,
    );
    final capturedInit =
        _context.referenceIdentifier(markedId, markedVariable, userDecl.id);
    final capturedDecl = _record(
      VarDecl(
        userDecl.id,
        initializer: capturedInit,
        source: userDecl.source,
        line: userDecl.line,
        column: userDecl.column,
        offset: userDecl.offset,
        length: userDecl.length,
      ),
      userDecl,
    );
    loop = _loopBlock(node.loop, capturedDecl);
  }
  final condition = node.condition ??
      _record(
        ASTLiteralBoolean(
          true,
          source: node.source,
          line: node.line,
          column: node.column,
          offset: node.offset,
          length: node.length,
        ),
        node,
      );
  _context.recordForLoop(
    node,
    HTForLowering(
      initializer: initializer,
      condition: condition,
      increment: node.increment,
      loop: loop,
      markedSymbols: markedSymbols,
    ),
  );
  node.subAccept(this);
}