Skip to content

Commit 0bca0f4

Browse files
authored
fix(system): fix system return statement in inner blocks (#117)
1 parent 3ca8782 commit 0bca0f4

File tree

1 file changed

+34
-6
lines changed
  • crates/bolt-lang/attribute/system/src

1 file changed

+34
-6
lines changed

crates/bolt-lang/attribute/system/src/lib.rs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,38 @@ pub fn system(attr: TokenStream, item: TokenStream) -> TokenStream {
7070
}
7171
}
7272

73+
impl SystemTransform {
74+
fn visit_stmts_mut(&mut self, stmts: &mut Vec<Stmt>) {
75+
for stmt in stmts {
76+
if let Stmt::Expr(ref mut expr) | Stmt::Semi(ref mut expr, _) = stmt {
77+
self.visit_expr_mut(expr);
78+
}
79+
}
80+
}
81+
}
82+
7383
/// Visits the AST and modifies the system function
7484
impl VisitMut for SystemTransform {
7585
// Modify the return instruction to return Result<Vec<u8>>
7686
fn visit_expr_mut(&mut self, expr: &mut Expr) {
87+
match expr {
88+
Expr::ForLoop(for_loop_expr) => {
89+
self.visit_stmts_mut(&mut for_loop_expr.body.stmts);
90+
}
91+
Expr::Loop(loop_expr) => {
92+
self.visit_stmts_mut(&mut loop_expr.body.stmts);
93+
}
94+
Expr::If(if_expr) => {
95+
self.visit_stmts_mut(&mut if_expr.then_branch.stmts);
96+
if let Some((_, else_expr)) = &mut if_expr.else_branch {
97+
self.visit_expr_mut(else_expr);
98+
}
99+
}
100+
Expr::Block(block_expr) => {
101+
self.visit_stmts_mut(&mut block_expr.block.stmts);
102+
}
103+
_ => (),
104+
}
77105
if let Some(inner_variable) = Self::extract_inner_ok_expression(expr) {
78106
let new_return_expr: Expr = match inner_variable {
79107
Expr::Tuple(tuple_expr) => {
@@ -88,7 +116,11 @@ impl VisitMut for SystemTransform {
88116
}
89117
}
90118
};
91-
*expr = new_return_expr;
119+
if let Expr::Return(return_expr) = expr {
120+
return_expr.expr = Some(Box::new(new_return_expr));
121+
} else {
122+
*expr = new_return_expr;
123+
}
92124
}
93125
}
94126

@@ -108,11 +140,7 @@ impl VisitMut for SystemTransform {
108140
Self::modify_fn_return_type(item_fn, self.return_values);
109141
// Modify the return statement inside the function body
110142
let block = &mut item_fn.block;
111-
for stmt in &mut block.stmts {
112-
if let Stmt::Expr(ref mut expr) | Stmt::Semi(ref mut expr, _) = stmt {
113-
self.visit_expr_mut(expr);
114-
}
115-
}
143+
self.visit_stmts_mut(&mut block.stmts);
116144
}
117145
}
118146
}

0 commit comments

Comments
 (0)