tada/src/desugar/var.rs
2022-11-22 17:14:52 +01:00

82 lines
2.6 KiB
Rust

use crate::ast::{BoundedSeparated, Call, Expr, Field, Lit, StringLit, TableConstrElem, Var};
use crate::builtin::Builtin;
use crate::span::HasSpan;
impl Var {
pub fn desugar(self) -> (Expr, bool) {
match self {
Self::Access {
s0: _,
index,
s1: _,
span,
} => {
let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span);
let new = Field::access(scope.expr().boxed(), index, span);
(new.expr(), true)
}
Self::Assign {
local: None,
s0: _,
index,
s1: _,
s2: _,
s3: _,
value,
span,
} => {
let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span);
let new = Field::assign(scope.expr().boxed(), index, value, span);
(new.expr(), true)
}
Self::Assign {
local: Some(_),
s0: _,
index,
s1: _,
s2: _,
s3: _,
value,
span,
} => {
let scope = Call::no_arg(Lit::Builtin(Builtin::Scope, span).expr().boxed(), span);
let constr = BoundedSeparated::new(span)
.then(TableConstrElem::positional(scope.expr().boxed()))
.then(TableConstrElem::positional(index))
.then(TableConstrElem::positional(value))
.table_constr();
let new = Call::constr(
Lit::Builtin(Builtin::SetRaw, span).expr().boxed(),
constr,
span,
);
(new.expr(), true)
}
Self::AccessIdent(name) => {
let span = name.span();
let new = Self::access(StringLit::from_ident(name).lit().expr().boxed(), span);
(new.expr(), true)
}
Self::AssignIdent {
local,
name,
s0: _,
s1: _,
value,
span,
} => {
let new = Self::assign(
local.is_some(),
StringLit::from_ident(name).lit().expr().boxed(),
value,
span,
);
(new.expr(), true)
}
}
}
}