visitForIterLoopStmt method

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

Implementation

@override
Object? visitForIterLoopStmt(ForIterLoopStmt forIterLoopStmt) {
  final prevScope = scope;
  pushScope();

  try {
    final key = forIterLoopStmt.key.lexeme;
    final val = forIterLoopStmt.value?.lexeme;

    final iterExpr = forIterLoopStmt.iterExpr.accept(this);

    // TODO: iter expr should be a function, not a table.
    // See https://github.com/TheMaverickProgrammer/DartLua/issues/5
    if (iterExpr is! LuaObject || !iterExpr.isTable) {
      final String lineInfo = this.lineInfo(forIterLoopStmt.token);
      restoreScope(prevScope);
      throw '$lineInfo Evaluation has encountered an unrecoverable scenario: iterator expression was not a table.';
    }

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

    if (val != null) {
      defLocal(LuaObject.nil(val));
    }

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

      if (val != null) {
        final iterVal = findVar(val);
        iterVal?.value = entry?.value;
      }

      for (Stmt stmt in forIterLoopStmt.body) {
        try {
          stmt.accept(this);
        } on LuaBreakStmtException {
          i = iterLen;
          break;
        } catch (e) {
          addError(e.toString());
        }
      }
    }
  } catch (e) {
    rethrow;
  } finally {
    restoreScope(prevScope);
  }

  return null;
}