cl_ast/desugar/
while_else.rs1use crate::{ast::*, ast_visitor::fold::Fold};
5use cl_structures::span::Span;
6
7pub struct WhileElseDesugar;
10
11impl Fold for WhileElseDesugar {
12 fn fold_expr(&mut self, e: Expr) -> Expr {
13 let Expr { span, kind } = e;
14 let kind = desugar_while(span, kind);
15 Expr { span: self.fold_span(span), kind: self.fold_expr_kind(kind) }
16 }
17}
18
19fn desugar_while(span: Span, kind: ExprKind) -> ExprKind {
21 match kind {
22 ExprKind::While(While { cond, pass, fail: Else { body } }) => {
24 let fail_span = body.as_ref().map(|body| body.span).unwrap_or(span);
26 let break_expr = Expr { span: fail_span, kind: ExprKind::Break(Break { body }) };
27
28 let loop_body = If { cond, pass, fail: Else { body: Some(Box::new(break_expr)) } };
29 let loop_body = ExprKind::If(loop_body);
30 ExprKind::Unary(Unary {
31 kind: UnaryKind::Loop,
32 tail: Box::new(Expr { span, kind: loop_body }),
33 })
34 }
35 _ => kind,
36 }
37}