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