From 630f9d342fcb396074168cc379776774a832d73e Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sun, 3 Dec 2023 07:23:06 +0800 Subject: [PATCH] fix(es/compat): Fix destructuring of export class/function (#8371) **Related issue:** - Closes #8366 --- .../fixture/issues-8xxx/8366/input/.swcrc | 21 +++++++++++++++++++ .../fixture/issues-8xxx/8366/input/index.js | 5 +++++ .../fixture/issues-8xxx/8366/output/index.js | 8 +++++++ .../src/destructuring.rs | 8 ++++++- 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 crates/swc/tests/fixture/issues-8xxx/8366/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-8xxx/8366/input/index.js create mode 100644 crates/swc/tests/fixture/issues-8xxx/8366/output/index.js diff --git a/crates/swc/tests/fixture/issues-8xxx/8366/input/.swcrc b/crates/swc/tests/fixture/issues-8xxx/8366/input/.swcrc new file mode 100644 index 000000000000..eba8b0f60673 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8366/input/.swcrc @@ -0,0 +1,21 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": false + }, + "loose": false, + "minify": { + "compress": false, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": true, + "env": { + "targets": "Chrome >= 50" + } +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8366/input/index.js b/crates/swc/tests/fixture/issues-8xxx/8366/input/index.js new file mode 100644 index 000000000000..95aad52469d6 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8366/input/index.js @@ -0,0 +1,5 @@ +export class F { + a({ b, c } = undefined) { } +} + +export function f({ b, c } = undefined) { } \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8366/output/index.js b/crates/swc/tests/fixture/issues-8xxx/8366/output/index.js new file mode 100644 index 000000000000..f9ec847b372a --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8366/output/index.js @@ -0,0 +1,8 @@ +export class F { + a(ref) { + let _ref = ref === void 0 ? undefined : ref, b = _ref.b, c = _ref.c; + } +} +export function f(ref) { + let _ref = ref === void 0 ? undefined : ref, b = _ref.b, c = _ref.c; +} diff --git a/crates/swc_ecma_compat_es2015/src/destructuring.rs b/crates/swc_ecma_compat_es2015/src/destructuring.rs index 90d1fe54d5cf..33d02cc137d2 100644 --- a/crates/swc_ecma_compat_es2015/src/destructuring.rs +++ b/crates/swc_ecma_compat_es2015/src/destructuring.rs @@ -1,4 +1,4 @@ -use std::iter; +use std::{iter, mem}; use serde::Deserialize; use swc_common::{util::take::Take, Spanned, SyntaxContext, DUMMY_SP}; @@ -559,6 +559,12 @@ impl VisitMut for AssignFolder { self.exporting = old; } + fn visit_mut_function(&mut self, f: &mut Function) { + let exporting = mem::replace(&mut self.exporting, false); + f.visit_mut_children_with(self); + self.exporting = exporting; + } + fn visit_mut_expr(&mut self, expr: &mut Expr) { let ignore_return_value = self.ignore_return_value.take().is_some();