diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-27 21:27:54 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-27 21:27:54 +0200 |
commit | 568773274bd6eec0979d865ba101c86143a0718b (patch) | |
tree | 006e947ca1441e927654b891f457af14aa3e6d68 /crates/rebel-parse | |
parent | 164b00565a0ccf858f180f5202e557883323b458 (diff) | |
download | rebel-568773274bd6eec0979d865ba101c86143a0718b.tar rebel-568773274bd6eec0979d865ba101c86143a0718b.zip |
rebel-parse: split combined assignment into assignment + binary op
Diffstat (limited to 'crates/rebel-parse')
-rw-r--r-- | crates/rebel-parse/src/ast.rs | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/crates/rebel-parse/src/ast.rs b/crates/rebel-parse/src/ast.rs index ef27ecf..16df2ad 100644 --- a/crates/rebel-parse/src/ast.rs +++ b/crates/rebel-parse/src/ast.rs @@ -20,19 +20,20 @@ pub type Body<'a> = Vec<BodyStmt<'a>>; #[derive(Debug, Clone, PartialEq, Eq)] pub enum BodyStmt<'a> { - Assign { - left: Box<TypedExpr<'a>>, - op: Option<OpBinary>, - right: Box<Expr<'a>>, - }, + Assign { dest: TypedExpr<'a>, expr: Expr<'a> }, } impl<'a> BodyStmt<'a> { - pub(crate) fn assign(left: TypedExpr<'a>, op: Option<OpBinary>, right: Expr<'a>) -> Self { - BodyStmt::Assign { - left: Box::new(left), - op, - right: Box::new(right), + pub(crate) fn assign(dest: TypedExpr<'a>, op: Option<OpBinary>, expr: Expr<'a>) -> Self { + match op { + Some(op) => { + let dest_expr = dest.expr.clone(); + BodyStmt::Assign { + dest, + expr: Expr::binary(dest_expr, op, expr), + } + } + None => BodyStmt::Assign { dest, expr }, } } } |