feat: array unpacking

This commit is contained in:
Shunsuke Shibayama 2024-03-16 13:19:15 +09:00
parent 74e89f6d5b
commit 95e675cccd
8 changed files with 153 additions and 26 deletions

View file

@ -893,6 +893,15 @@ impl Parser {
debug_exit_info!(self);
return Ok(ArrayInner::WithLength(elems.remove_pos(0), len));
}
Some(PreStar) => {
self.lpop();
let rest = self
.try_reduce_expr(false, false, false, false)
.map_err(|_| self.stack_dec(fn_name!()))?;
elems.set_var_args(PosArg::new(rest));
debug_exit_info!(self);
return Ok(ArrayInner::Normal(elems));
}
Some(Inclusion) => {
self.lpop();
let Expr::Accessor(Accessor::Ident(sym)) = elems.remove_pos(0).expr else {
@ -981,6 +990,14 @@ impl Parser {
Some(RParen | RSqBr | RBrace | Dedent) => {
break;
}
Some(PreStar) => {
self.lpop();
let rest = self
.try_reduce_expr(false, false, false, false)
.map_err(|_| self.stack_dec(fn_name!()))?;
elems.set_var_args(PosArg::new(rest));
break;
}
_ => {}
}
elems.push_pos(
@ -2485,6 +2502,7 @@ impl Parser {
debug_exit_info!(self);
Ok(call_or_acc)
}
// REVIEW: correct?
Some(t) if t.is(PreStar) || t.is(PreDblStar) => {
let kind = t.kind;
let _ = self.lpop();