visitForIterLoopStmt method
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;
}