visitForIterLoopStmt method

  1. @override
Object? visitForIterLoopStmt(
  1. ForIterLoopStmt forIterLoopStmt
)
override

Implementation

@override
Object? visitForIterLoopStmt(ForIterLoopStmt forIterLoopStmt) {
  pushScope();

  final key = forIterLoopStmt.key.lexeme;
  final val = forIterLoopStmt.value.lexeme;

  final iterExpr = forIterLoopStmt.iterExpr.accept(this);
  if (iterExpr is! LuaObject || !iterExpr.isTable) {
    final String lineInfo = this.lineInfo(forIterLoopStmt.token);
    popScope();
    throw '$lineInfo Evaluation has encountered an unrecoverable scenario: iterator expression was not a table.';
  }

  final iterLen = iterExpr.length;
  defLocal(LuaObject.nil(key));
  defLocal(LuaObject.nil(val));

  for (int i = 0; i < iterLen; i++) {
    final iterKey = findVar(key);
    final iterVal = findVar(val);
    final entry = iterExpr.fields!.entries.elementAtOrNull(i);
    iterKey?.value = entry?.key;
    iterVal?.value = entry?.value;

    for (Stmt stmt in forIterLoopStmt.body) {
      try {
        stmt.accept(this);
      } catch (e) {
        addError(e.toString());
      }
    }
  }
  popScope();

  return null;
}