From 6aa851fcf91b19a234b301f2697e54d65e131c7a Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 5 May 2026 18:02:50 +0200 Subject: [PATCH] iterator codegen --- parser/src/ast.rs | 1 + parser/src/lib.rs | 1 + src/codegen.rs | 9 +++++++++ test/src/main.mist | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/parser/src/ast.rs b/parser/src/ast.rs index e58eba5..fb72ea9 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -115,6 +115,7 @@ pub enum Statement { For { pattern: String, iterator: Expression, + body: Box, }, Return(Option), diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 485829d..14c4e46 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -343,6 +343,7 @@ impl From> for Statement { Rule::for_stmt => Statement::For { pattern: inner.next().unwrap().as_str().to_string(), iterator: inner.next().unwrap().into(), + body: Box::new(Statement::from(inner.next().unwrap())), }, Rule::assign_statement => Statement::VarAssign(VarAssignStmt { diff --git a/src/codegen.rs b/src/codegen.rs index 58dbcfb..3440a77 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -417,6 +417,15 @@ impl ToRust for Statement { cg.add_indentedln("}"); } + Statement::For { + pattern, + iterator, + body, + } => { + cg.add_indentedln(&format!("for {} in {}", pattern, iterator.get_rust())); + cg.ensure_brackets(body); + } + Statement::Return(expr) => { let val = expr.as_ref().map(|e| e.get_rust()).unwrap_or_default(); cg.add_indentedln(&format!("return {};", val)); diff --git a/test/src/main.mist b/test/src/main.mist index ec6c405..d07cd7b 100644 --- a/test/src/main.mist +++ b/test/src/main.mist @@ -1,5 +1,5 @@ void main() { - let iter = vec!(1, 2, 3, 4, 5); + Vec iter = vec!(1, 2, 3, 4, 5); for (i in iter) { println!("{i}");