Skip to content

Commit a11603a

Browse files
authored
Merge 8019ac8 into d5c4ebe
2 parents d5c4ebe + 8019ac8 commit a11603a

4 files changed

Lines changed: 37 additions & 8 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
swc_core: patch
3+
swc_ecma_parser: patch
4+
---
5+
6+
fix(parser): reject invalid object rest assignment targets

crates/swc_ecma_parser/src/parser/pat.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,15 +246,32 @@ impl<I: Tokens> Parser<I> {
246246
};
247247

248248
let element_pat_ty = pat_ty.element();
249-
let pat = if let PatType::BindingElement = element_pat_ty {
250-
if let Expr::Ident(i) = *expr {
251-
i.into()
252-
} else {
253-
self.emit_err(span, SyntaxError::DotsWithoutIdentifier);
254-
Pat::Invalid(Invalid { span })
249+
let pat = match element_pat_ty {
250+
PatType::BindingElement => {
251+
if let Expr::Ident(i) = *expr {
252+
i.into()
253+
} else {
254+
self.emit_err(
255+
span,
256+
SyntaxError::DotsWithoutIdentifier,
257+
);
258+
Pat::Invalid(Invalid { span })
259+
}
255260
}
256-
} else {
257-
self.reparse_expr_as_pat(element_pat_ty, expr)?
261+
PatType::AssignElement => {
262+
if !expr.is_valid_simple_assignment_target(
263+
self.ctx().contains(Context::Strict),
264+
) {
265+
self.emit_err(span, SyntaxError::NotSimpleAssign);
266+
expr.into()
267+
} else {
268+
self.reparse_expr_as_pat(element_pat_ty, expr)?
269+
}
270+
}
271+
_ => unreachable!(
272+
"object rest element must be binding/assignment \
273+
element"
274+
),
258275
};
259276
if let Pat::Assign(_) = pat {
260277
self.emit_err(span, SyntaxError::TS1048)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
({...{}} = {});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
x Cannot assign to this
2+
,-[$DIR/tests/errors/issue-11543/input.js:1:1]
3+
1 | ({...{}} = {});
4+
: ^^^^^
5+
`----

0 commit comments

Comments
 (0)