visitForRangeStmt method

  1. @override
Uint8List visitForRangeStmt(
  1. ForRangeExpr stmt
)
override

Implementation

@override
Uint8List visitForRangeStmt(ForRangeExpr stmt) {
  final bytesBuilder = BytesBuilder();
  bytesBuilder.add(_lineInfo(stmt.line, stmt.column));
  bytesBuilder.addByte(OpCode.codeBlock);
  bytesBuilder.add(_identifier(InternalIdentifier.forExpressionInit));

  final collection = stmt.iterateValue
      ? MemberExpr(
          stmt.collection, IdentifierExpr(_lexicon.idValues, isLocal: false))
      : stmt.collection;

  // declare the iterator
  final iterInit = MemberExpr(
      collection, IdentifierExpr(_lexicon.idIterator, isLocal: false));
  // final iterInitBytes = compileAST(iterInit, endOfExec: true);
  final iterId = '__iter${iterIndex++}';
  final iterDecl = VarDecl(
    IdentifierExpr(iterId),
    initializer: iterInit,
    line: stmt.iterator.line,
    column: stmt.iterator.column,
  );
  // final iterDecl = _assembleVarDeclStmt(
  //     iterId, stmt.iterator.line, stmt.iterator.column,
  //     initializer: iterInitBytes);
  bytesBuilder.add(visitVarDecl(iterDecl));

  // update iter move result
  // calls iterator.moveNext()
  final moveIter = CallExpr(MemberExpr(IdentifierExpr(iterId),
      IdentifierExpr(_lexicon.idMoveNext, isLocal: false)));
  final moveIterBytes = visitCallExpr(moveIter);
  final condition = moveIterBytes;

  // get current item value
  stmt.iterator.initializer = MemberExpr(IdentifierExpr(iterId),
      IdentifierExpr(_lexicon.idCurrent, isLocal: false));
  stmt.loop.statements.insert(0, stmt.iterator);
  final loop = visitBlockStmt(stmt.loop);

  bytesBuilder.addByte(OpCode.loopPoint);
  final continueLength = condition.length + 1 + loop.length;
  final loopLength = condition.length + 1 + loop.length + 3;
  bytesBuilder.add(_uint16(continueLength));
  bytesBuilder.add(_uint16(loopLength));
  bytesBuilder.add(condition);
  bytesBuilder.addByte(OpCode.whileStmt);
  bytesBuilder.add(loop);
  bytesBuilder.addByte(OpCode.skip);
  bytesBuilder.add(_int16(-loopLength));
  bytesBuilder.addByte(OpCode.endOfCodeBlock);
  return bytesBuilder.toBytes();
}