feat(ast): add AssignmentTargetRest (#2601)

closes #2598
This commit is contained in:
Boshen 2024-03-04 14:31:22 +08:00 committed by GitHub
parent 9cc960e591
commit 20c7bf7835
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 44 additions and 12 deletions

View file

@ -974,7 +974,7 @@ pub struct ArrayAssignmentTarget<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub elements: Vec<'a, Option<AssignmentTargetMaybeDefault<'a>>>,
pub rest: Option<AssignmentTarget<'a>>,
pub rest: Option<AssignmentTargetRest<'a>>,
pub trailing_comma: Option<Span>,
}
@ -994,7 +994,7 @@ pub struct ObjectAssignmentTarget<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub properties: Vec<'a, AssignmentTargetProperty<'a>>,
pub rest: Option<AssignmentTarget<'a>>,
pub rest: Option<AssignmentTargetRest<'a>>,
}
impl<'a> ObjectAssignmentTarget<'a> {
@ -1007,6 +1007,15 @@ impl<'a> ObjectAssignmentTarget<'a> {
}
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(tag = "type"))]
#[cfg_attr(all(feature = "serde", feature = "wasm"), derive(tsify::Tsify))]
pub struct AssignmentTargetRest<'a> {
#[cfg_attr(feature = "serde", serde(flatten))]
pub span: Span,
pub target: AssignmentTarget<'a>,
}
#[derive(Debug, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize), serde(untagged))]
#[cfg_attr(all(feature = "serde", feature = "wasm"), derive(tsify::Tsify))]

View file

@ -948,7 +948,7 @@ pub trait Visit<'a>: Sized {
self.visit_assignment_target_maybe_default(element);
}
if let Some(target) = &target.rest {
self.visit_assignment_target(target);
self.visit_assignment_target_rest(target);
}
}
@ -976,7 +976,7 @@ pub trait Visit<'a>: Sized {
self.visit_assignment_target_property(property);
}
if let Some(target) = &target.rest {
self.visit_assignment_target(target);
self.visit_assignment_target_rest(target);
}
}
@ -1009,6 +1009,10 @@ pub trait Visit<'a>: Sized {
self.visit_assignment_target_maybe_default(&property.binding);
}
fn visit_assignment_target_rest(&mut self, rest: &AssignmentTargetRest<'a>) {
self.visit_assignment_target(&rest.target);
}
/* ---------- Expression ---------- */
fn visit_jsx_element(&mut self, elem: &JSXElement<'a>) {

View file

@ -935,7 +935,7 @@ pub trait VisitMut<'a>: Sized {
self.visit_assignment_target_maybe_default(element);
}
if let Some(target) = &mut target.rest {
self.visit_assignment_target(target);
self.visit_assignment_target_rest(target);
}
}
@ -969,7 +969,7 @@ pub trait VisitMut<'a>: Sized {
self.visit_assignment_target_property(property);
}
if let Some(target) = &mut target.rest {
self.visit_assignment_target(target);
self.visit_assignment_target_rest(target);
}
}
@ -1002,6 +1002,10 @@ pub trait VisitMut<'a>: Sized {
self.visit_assignment_target_maybe_default(&mut property.binding);
}
fn visit_assignment_target_rest(&mut self, rest: &mut AssignmentTargetRest<'a>) {
self.visit_assignment_target(&mut rest.target);
}
/* ---------- Expression ---------- */
fn visit_jsx_element(&mut self, elem: &mut JSXElement<'a>) {

View file

@ -1800,7 +1800,6 @@ impl<'a, const MINIFY: bool> Gen<MINIFY> for ArrayAssignmentTarget<'a> {
p.print_comma();
}
p.add_source_mapping(self.span.start);
p.print_ellipsis();
target.gen(p, ctx);
}
if self.trailing_comma.is_some() {
@ -1829,7 +1828,6 @@ impl<'a, const MINIFY: bool> Gen<MINIFY> for ObjectAssignmentTarget<'a> {
p.print_comma();
}
p.add_source_mapping(self.span.start);
p.print_ellipsis();
target.gen(p, ctx);
}
p.print(b'}');
@ -1893,6 +1891,13 @@ impl<'a, const MINIFY: bool> Gen<MINIFY> for AssignmentTargetPropertyProperty<'a
}
}
impl<'a, const MINIFY: bool> Gen<MINIFY> for AssignmentTargetRest<'a> {
fn gen(&self, p: &mut Codegen<{ MINIFY }>, ctx: Context) {
p.print_ellipsis();
self.target.gen(p, ctx);
}
}
impl<'a, const MINIFY: bool> GenExpr<MINIFY> for SequenceExpression<'a> {
fn gen_expr(&self, p: &mut Codegen<{ MINIFY }>, precedence: Precedence, _ctx: Context) {
p.wrap(precedence > self.precedence(), |p| {

View file

@ -78,7 +78,10 @@ impl<'a> CoverGrammar<'a, ArrayExpression<'a>> for ArrayAssignmentTarget<'a> {
}
ArrayExpressionElement::SpreadElement(elem) => {
if i == len - 1 {
rest = Some(AssignmentTarget::cover(elem.unbox().argument, p)?);
rest = Some(AssignmentTargetRest {
span: elem.span,
target: AssignmentTarget::cover(elem.unbox().argument, p)?,
});
if let Some(span) = expr.trailing_comma {
p.error(diagnostics::BindingRestElementTrailingComma(span));
}
@ -134,7 +137,10 @@ impl<'a> CoverGrammar<'a, ObjectExpression<'a>> for ObjectAssignmentTarget<'a> {
}
ObjectPropertyKind::SpreadProperty(spread) => {
if i == len - 1 {
rest = Some(AssignmentTarget::cover(spread.unbox().argument, p)?);
rest = Some(AssignmentTargetRest {
span: spread.span,
target: AssignmentTarget::cover(spread.unbox().argument, p)?,
});
} else {
return Err(diagnostics::SpreadLastElement(spread.span).into());
}

View file

@ -197,7 +197,6 @@ fn print_array_elements<'a>(p: &mut Prettier<'a>, array: &Array<'a, '_>) -> Doc<
if let Some(rest) = &array_pat.rest {
parts.push(ss!(","));
parts.push(line!());
parts.push(ss!("..."));
parts.push(rest.format(p));
}
}

View file

@ -1824,6 +1824,12 @@ impl<'a> Format<'a> for AssignmentTargetPropertyProperty<'a> {
}
}
impl<'a> Format<'a> for AssignmentTargetRest<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
array![p, ss!("..."), self.target.format(p)]
}
}
impl<'a> Format<'a> for SequenceExpression<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
wrap!(p, self, SequenceExpression, {

View file

@ -99,7 +99,6 @@ pub(super) fn print_object_properties<'a>(
ObjectLike::Expression(_) => {}
ObjectLike::AssignmentTarget(target) => {
if let Some(rest) = &target.rest {
indent_parts.push(ss!("..."));
indent_parts.push(rest.format(p));
}
}