visitForRangeStmt method

  1. @override
void visitForRangeStmt(
  1. ForRangeExpr node
)
override

Implementation

@override
void visitForRangeStmt(ForRangeExpr node) {
  final iterVariable = _context.optimization.loopBindings[node]!.first;
  final iterId = _context.nextIteratorId();
  final collection = node.iterateValue
      ? _member(node.collection, _lexicon.idValues, node.collection)
      : node.collection;
  final iterInit = _member(collection, _lexicon.idIterator, node.iterator);
  final iterator = _record(
    VarDecl(
      _context.declarationIdentifier(iterId, iterVariable, node.iterator.id),
      initializer: iterInit,
      source: node.iterator.source,
      line: node.iterator.line,
      column: node.iterator.column,
      offset: node.iterator.offset,
      length: node.iterator.length,
    ),
    node.iterator,
  );
  final condition = _record(
    CallExpr(
      _member(
        _context.referenceIdentifier(iterId, iterVariable, node.iterator),
        _lexicon.idMoveNext,
        node.iterator,
      ),
      source: node.source,
      line: node.line,
      column: node.column,
      offset: node.offset,
      length: node.length,
    ),
    node,
  );
  final current = _member(
    _context.referenceIdentifier(iterId, iterVariable, node.iterator),
    _lexicon.idCurrent,
    node.iterator,
  );
  final item = _iterationDeclaration(node.iterator, current);
  _context.recordForRangeLoop(
    node,
    HTForRangeLowering(
      iterator: iterator,
      condition: condition,
      loop: _loopBlock(node.loop, item),
    ),
  );
  node.subAccept(this);
}