Desugar field assignment

This commit is contained in:
Joscha 2022-11-21 14:05:07 +01:00
parent 3f8320941a
commit ebc48fff5a

View file

@ -75,8 +75,10 @@ impl Field {
value,
span,
} => {
let (expr, desugared) = expr.desugar();
if desugared {
let new = Expr::Field(Self::Assign {
expr,
expr: Box::new(expr),
s0,
s1,
index,
@ -86,7 +88,69 @@ impl Field {
value,
span,
});
(new, true) // TODO Implement
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)
}
Self::AccessIdent {