summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2024-04-27 21:27:54 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2024-04-27 21:27:54 +0200
commit568773274bd6eec0979d865ba101c86143a0718b (patch)
tree006e947ca1441e927654b891f457af14aa3e6d68 /crates
parent164b00565a0ccf858f180f5202e557883323b458 (diff)
downloadrebel-568773274bd6eec0979d865ba101c86143a0718b.tar
rebel-568773274bd6eec0979d865ba101c86143a0718b.zip
rebel-parse: split combined assignment into assignment + binary op
Diffstat (limited to 'crates')
-rw-r--r--crates/rebel-parse/src/ast.rs21
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 },
}
}
}