From ebc48fff5a85adbff2c6d01e3dbef7a15c9acf92 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 21 Nov 2022 14:05:07 +0100 Subject: [PATCH] Desugar field assignment --- src/desugar/field.rs | 84 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 10 deletions(-) diff --git a/src/desugar/field.rs b/src/desugar/field.rs index fb086f3..31df828 100644 --- a/src/desugar/field.rs +++ b/src/desugar/field.rs @@ -75,18 +75,82 @@ impl Field { value, span, } => { - let new = Expr::Field(Self::Assign { - expr, - s0, - s1, - index, - s2, - s3, - s4, - value, + let (expr, desugared) = expr.desugar(); + if desugared { + let new = Expr::Field(Self::Assign { + expr: Box::new(expr), + s0, + s1, + index, + s2, + s3, + s4, + value, + span, + }); + return (new, true); + } + + let (index, desugared) = index.desugar(); + if desugared { + let new = Expr::Field(Self::Assign { + expr: Box::new(expr), + s0, + s1, + index: Box::new(index), + s2, + s3, + s4, + value, + span, + }); + return (new, true); + } + + let (value, desugared) = value.desugar(); + if desugared { + let new = Expr::Field(Self::Assign { + expr: Box::new(expr), + s0, + s1, + index: Box::new(index), + s2, + s3, + s4, + value: Box::new(value), + span, + }); + return (new, true); + } + + let elems = Separated::NonEmpty { + first_elem: TableConstrElem::Lit(TableLitElem::Positional(Box::new(expr))), + last_elems: vec![ + ( + (Space::empty(span), Space::empty(span)), + TableConstrElem::Lit(TableLitElem::Positional(Box::new(index))), + ), + ( + (Space::empty(span), Space::empty(span)), + TableConstrElem::Lit(TableLitElem::Positional(Box::new(value))), + ), + ], + trailing: None, + span, + }; + let constr = TableConstr { + s0: Space::empty(span), + elems, + s1: Space::empty(span), + span, + }; + let new = Expr::Call(Call::Constr { + expr: Box::new(Expr::Lit(Lit::Builtin(Builtin::Set, span))), + s0: Space::empty(span), + constr, span, }); - (new, true) // TODO Implement + (new, true) } Self::AccessIdent {