diff --git a/crates/swc_ecma_transforms_compat/src/es2015/parameters.rs b/crates/swc_ecma_transforms_compat/src/es2015/parameters.rs index b32c0ed07ec..aaebe5308d2 100644 --- a/crates/swc_ecma_transforms_compat/src/es2015/parameters.rs +++ b/crates/swc_ecma_transforms_compat/src/es2015/parameters.rs @@ -437,6 +437,33 @@ impl VisitMut for Params { self.in_prop = old_in_prop; } + fn visit_mut_class_method(&mut self, m: &mut ClassMethod) { + if let MethodKind::Setter = m.kind { + let f = &mut m.function; + + if f.body.is_none() { + return; + } + + let old_in_subclass = self.in_subclass; + let old_in_prop = self.in_prop; + self.in_subclass = false; + self.in_prop = false; + + f.visit_mut_children_with(self); + + let mut body = f.body.take().unwrap(); + self.visit_mut_fn_like(&mut f.params, &mut body, true); + + f.body = Some(body); + + self.in_subclass = old_in_subclass; + self.in_prop = old_in_prop; + } else { + m.visit_mut_children_with(self); + } + } + // same for private prop fn visit_mut_private_prop(&mut self, prop: &mut PrivateProp) { let old_in_prop = self.in_prop; diff --git a/crates/swc_ecma_transforms_compat/tests/parameters/vercel-1/input.js b/crates/swc_ecma_transforms_compat/tests/parameters/vercel-1/input.js new file mode 100644 index 00000000000..efb113f24a1 --- /dev/null +++ b/crates/swc_ecma_transforms_compat/tests/parameters/vercel-1/input.js @@ -0,0 +1,5 @@ +class Test { + set property(value = null) { + // oh no, will generate code that is a SyntaxError + } +} \ No newline at end of file diff --git a/crates/swc_ecma_transforms_compat/tests/parameters/vercel-1/output.js b/crates/swc_ecma_transforms_compat/tests/parameters/vercel-1/output.js new file mode 100644 index 00000000000..e73f2739cb1 --- /dev/null +++ b/crates/swc_ecma_transforms_compat/tests/parameters/vercel-1/output.js @@ -0,0 +1,6 @@ +class Test { + set property(value) { + if (value === void 0) value = null; + // oh no, will generate code that is a SyntaxError + } +}