82 lines
2.6 KiB
Rust
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)
|
|
}
|
|
}
|
|
}
|
|
}
|