feat: for-in range loops in selfhost + bootstrap

- Parser: add parseRange for selfhost (.. / ..=)
- Sema: determine loop variable type from range bounds
- HIR Lower: desugar range for-in to while loop with counter
- Bootstrap sema: fix range-based for variable type (was unknown)
- Selfhost loop remains deterministic
This commit is contained in:
2026-06-09 21:53:12 +03:00
parent 6414ef236b
commit 74db8a5790
4 changed files with 194 additions and 4 deletions
+6 -2
View File
@@ -1440,9 +1440,13 @@ proc checkStmt(sema: var Sema, stmt: Stmt, scope: Scope): Type =
discard sema.checkStmt(Stmt(kind: skExpr, loc: stmt.stmtLoopBody.loc, stmtExpr: Expr(kind: ekBlock, loc: stmt.stmtLoopBody.loc, exprBlock: stmt.stmtLoopBody)), scope)
return makeVoid()
of skFor:
discard sema.checkExpr(stmt.stmtForIter, scope)
let iterExpr = stmt.stmtForIter
discard sema.checkExpr(iterExpr, scope)
var forScope = newScope(scope)
let iterSym = Symbol(kind: skVar, name: stmt.stmtForVar, typ: makeUnknown(), isMutable: true)
var iterTyp = makeUnknown()
if iterExpr.kind == ekRange:
iterTyp = sema.checkExpr(iterExpr.exprRangeLo, scope)
let iterSym = Symbol(kind: skVar, name: stmt.stmtForVar, typ: iterTyp, isMutable: true)
discard forScope.define(iterSym)
discard sema.checkStmt(Stmt(kind: skExpr, loc: stmt.stmtForBody.loc, stmtExpr: Expr(kind: ekBlock, loc: stmt.stmtForBody.loc, exprBlock: stmt.stmtForBody)), forScope)
return makeVoid()