visitForRangeStmt method
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);
}