From c087c82aa3131ecafa2e42cdef6ecfba6c80b9b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 4 Jul 2023 15:59:58 +0900 Subject: [PATCH] fix(es/compat): Visit transformed expression in optional chaining pass (#7614) **Related issue:** - Closes #7612. --- .../fixture/issues-7xxx/7612/input/.swcrc | 19 +++++++++++++++++++ .../tests/fixture/issues-7xxx/7612/input/1.js | 1 + .../fixture/issues-7xxx/7612/output/1.js | 2 ++ .../tsc-references/deleteChain.1.normal.js | 6 +++--- .../tsc-references/deleteChain.2.minified.js | 4 ++-- .../src/es2020/optional_chaining.rs | 5 ++++- .../general-member-access/output.js | 4 ++-- 7 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 crates/swc/tests/fixture/issues-7xxx/7612/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-7xxx/7612/input/1.js create mode 100644 crates/swc/tests/fixture/issues-7xxx/7612/output/1.js diff --git a/crates/swc/tests/fixture/issues-7xxx/7612/input/.swcrc b/crates/swc/tests/fixture/issues-7xxx/7612/input/.swcrc new file mode 100644 index 00000000000..65f433d6c2c --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7612/input/.swcrc @@ -0,0 +1,19 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": true + }, + "target": "es5", + "loose": false, + "minify": { + "compress": false, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": true +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-7xxx/7612/input/1.js b/crates/swc/tests/fixture/issues-7xxx/7612/input/1.js new file mode 100644 index 00000000000..2f9b88a649a --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7612/input/1.js @@ -0,0 +1 @@ +(qcData?.flawImageList || [])?.map() diff --git a/crates/swc/tests/fixture/issues-7xxx/7612/output/1.js b/crates/swc/tests/fixture/issues-7xxx/7612/output/1.js new file mode 100644 index 00000000000..9bd98b4b829 --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7612/output/1.js @@ -0,0 +1,2 @@ +var _this, _qcData; +(_this = ((_qcData = qcData) === null || _qcData === void 0 ? void 0 : _qcData.flawImageList) || []) === null || _this === void 0 ? void 0 : _this.map(); diff --git a/crates/swc/tests/tsc-references/deleteChain.1.normal.js b/crates/swc/tests/tsc-references/deleteChain.1.normal.js index 18dbe291fec..790f9fee63f 100644 --- a/crates/swc/tests/tsc-references/deleteChain.1.normal.js +++ b/crates/swc/tests/tsc-references/deleteChain.1.normal.js @@ -1,5 +1,5 @@ //// [deleteChain.ts] -var _o1, _o11, _o2, _o21, _o3_b, _o3_b1, _o4_b_c_d, _o4_b, _this, _o4_b_c_d1, _o4_b1, _o5_b_c_d, _o5_b, _o5, _o5_b_c_d1, _o5_b1, _o51, _o6_b_c_d, _o6_b, _o6_b_c_d1, _o6_b1; +var _o1, _o11, _o2, _o21, _o3_b, _o3_b1, _o4_b_c_d, _o4_b, _this, _o4_b1, _o4_b_c_d1, _o4_b2, _o5_b_c_d, _o5_b, _o5, _o5_b_c_d1, _o5_b1, _o51, _o6_b_c_d, _o6_b, _o6_b_c_d1, _o6_b1; (_o1 = o1) === null || _o1 === void 0 ? true : delete _o1.b; delete ((_o11 = o1) === null || _o11 === void 0 ? void 0 : _o11.b); (_o2 = o2) === null || _o2 === void 0 ? true : delete _o2.b.c; @@ -7,8 +7,8 @@ delete ((_o21 = o2) === null || _o21 === void 0 ? void 0 : _o21.b.c); (_o3_b = o3.b) === null || _o3_b === void 0 ? true : delete _o3_b.c; delete ((_o3_b1 = o3.b) === null || _o3_b1 === void 0 ? void 0 : _o3_b1.c); (_o4_b = o4.b) === null || _o4_b === void 0 ? true : (_o4_b_c_d = _o4_b.c.d) === null || _o4_b_c_d === void 0 ? true : delete _o4_b_c_d.e; -(_this = (o4.b?.c.d)) === null || _this === void 0 ? true : delete _this.e; -delete ((_o4_b1 = o4.b) === null || _o4_b1 === void 0 ? void 0 : (_o4_b_c_d1 = _o4_b1.c.d) === null || _o4_b_c_d1 === void 0 ? void 0 : _o4_b_c_d1.e); +(_this = (_o4_b1 = o4.b) === null || _o4_b1 === void 0 ? void 0 : _o4_b1.c.d) === null || _this === void 0 ? true : delete _this.e; +delete ((_o4_b2 = o4.b) === null || _o4_b2 === void 0 ? void 0 : (_o4_b_c_d1 = _o4_b2.c.d) === null || _o4_b_c_d1 === void 0 ? void 0 : _o4_b_c_d1.e); (_o5_b = (_o5 = o5).b) === null || _o5_b === void 0 ? true : (_o5_b_c_d = _o5_b.call(_o5).c.d) === null || _o5_b_c_d === void 0 ? true : delete _o5_b_c_d.e; delete ((_o5_b1 = (_o51 = o5).b) === null || _o5_b1 === void 0 ? void 0 : (_o5_b_c_d1 = _o5_b1.call(_o51).c.d) === null || _o5_b_c_d1 === void 0 ? void 0 : _o5_b_c_d1.e); (_o6_b = o6.b) === null || _o6_b === void 0 ? true : (_o6_b_c_d = _o6_b["c"].d) === null || _o6_b_c_d === void 0 ? true : delete _o6_b_c_d["e"]; diff --git a/crates/swc/tests/tsc-references/deleteChain.2.minified.js b/crates/swc/tests/tsc-references/deleteChain.2.minified.js index 61142f8276c..b55a36419ff 100644 --- a/crates/swc/tests/tsc-references/deleteChain.2.minified.js +++ b/crates/swc/tests/tsc-references/deleteChain.2.minified.js @@ -1,3 +1,3 @@ //// [deleteChain.ts] -var _o1, _o11, _o2, _o21, _o3_b, _o3_b1, _o4_b_c_d, _o4_b, _this, _o4_b_c_d1, _o4_b1, _o5_b_c_d, _o5_b, _o5, _o5_b_c_d1, _o5_b1, _o51, _o6_b_c_d, _o6_b, _o6_b_c_d1, _o6_b1; -null === (_o1 = o1) || void 0 === _o1 || delete _o1.b, delete (null === (_o11 = o1) || void 0 === _o11 ? void 0 : _o11.b), null === (_o2 = o2) || void 0 === _o2 || delete _o2.b.c, delete (null === (_o21 = o2) || void 0 === _o21 ? void 0 : _o21.b.c), null === (_o3_b = o3.b) || void 0 === _o3_b || delete _o3_b.c, delete (null === (_o3_b1 = o3.b) || void 0 === _o3_b1 ? void 0 : _o3_b1.c), null === (_o4_b = o4.b) || void 0 === _o4_b || null === (_o4_b_c_d = _o4_b.c.d) || void 0 === _o4_b_c_d || delete _o4_b_c_d.e, null === (_this = o4.b?.c.d) || void 0 === _this || delete _this.e, delete (null === (_o4_b1 = o4.b) || void 0 === _o4_b1 ? void 0 : null === (_o4_b_c_d1 = _o4_b1.c.d) || void 0 === _o4_b_c_d1 ? void 0 : _o4_b_c_d1.e), null === (_o5_b = (_o5 = o5).b) || void 0 === _o5_b || null === (_o5_b_c_d = _o5_b.call(_o5).c.d) || void 0 === _o5_b_c_d || delete _o5_b_c_d.e, delete (null === (_o5_b1 = (_o51 = o5).b) || void 0 === _o5_b1 ? void 0 : null === (_o5_b_c_d1 = _o5_b1.call(_o51).c.d) || void 0 === _o5_b_c_d1 ? void 0 : _o5_b_c_d1.e), null === (_o6_b = o6.b) || void 0 === _o6_b || null === (_o6_b_c_d = _o6_b.c.d) || void 0 === _o6_b_c_d || delete _o6_b_c_d.e, delete (null === (_o6_b1 = o6.b) || void 0 === _o6_b1 ? void 0 : null === (_o6_b_c_d1 = _o6_b1.c.d) || void 0 === _o6_b_c_d1 ? void 0 : _o6_b_c_d1.e); +var _o1, _o11, _o2, _o21, _o3_b, _o3_b1, _o4_b_c_d, _o4_b, _this, _o4_b1, _o4_b_c_d1, _o4_b2, _o5_b_c_d, _o5_b, _o5, _o5_b_c_d1, _o5_b1, _o51, _o6_b_c_d, _o6_b, _o6_b_c_d1, _o6_b1; +null === (_o1 = o1) || void 0 === _o1 || delete _o1.b, delete (null === (_o11 = o1) || void 0 === _o11 ? void 0 : _o11.b), null === (_o2 = o2) || void 0 === _o2 || delete _o2.b.c, delete (null === (_o21 = o2) || void 0 === _o21 ? void 0 : _o21.b.c), null === (_o3_b = o3.b) || void 0 === _o3_b || delete _o3_b.c, delete (null === (_o3_b1 = o3.b) || void 0 === _o3_b1 ? void 0 : _o3_b1.c), null === (_o4_b = o4.b) || void 0 === _o4_b || null === (_o4_b_c_d = _o4_b.c.d) || void 0 === _o4_b_c_d || delete _o4_b_c_d.e, null === (_this = null === (_o4_b1 = o4.b) || void 0 === _o4_b1 ? void 0 : _o4_b1.c.d) || void 0 === _this || delete _this.e, delete (null === (_o4_b2 = o4.b) || void 0 === _o4_b2 ? void 0 : null === (_o4_b_c_d1 = _o4_b2.c.d) || void 0 === _o4_b_c_d1 ? void 0 : _o4_b_c_d1.e), null === (_o5_b = (_o5 = o5).b) || void 0 === _o5_b || null === (_o5_b_c_d = _o5_b.call(_o5).c.d) || void 0 === _o5_b_c_d || delete _o5_b_c_d.e, delete (null === (_o5_b1 = (_o51 = o5).b) || void 0 === _o5_b1 ? void 0 : null === (_o5_b_c_d1 = _o5_b1.call(_o51).c.d) || void 0 === _o5_b_c_d1 ? void 0 : _o5_b_c_d1.e), null === (_o6_b = o6.b) || void 0 === _o6_b || null === (_o6_b_c_d = _o6_b.c.d) || void 0 === _o6_b_c_d || delete _o6_b_c_d.e, delete (null === (_o6_b1 = o6.b) || void 0 === _o6_b1 ? void 0 : null === (_o6_b_c_d1 = _o6_b1.c.d) || void 0 === _o6_b_c_d1 ? void 0 : _o6_b_c_d1.e); diff --git a/crates/swc_ecma_transforms_compat/src/es2020/optional_chaining.rs b/crates/swc_ecma_transforms_compat/src/es2020/optional_chaining.rs index 1147075e1be..1ce54d21849 100644 --- a/crates/swc_ecma_transforms_compat/src/es2020/optional_chaining.rs +++ b/crates/swc_ecma_transforms_compat/src/es2020/optional_chaining.rs @@ -203,7 +203,10 @@ impl OptChaining { Expr::OptChain(next) => { current = next; } - base => return (base, count, chain), + mut base => { + base.visit_mut_children_with(self); + return (base, count, chain); + } } } } diff --git a/crates/swc_ecma_transforms_compat/tests/optional-chaining/general-member-access/output.js b/crates/swc_ecma_transforms_compat/tests/optional-chaining/general-member-access/output.js index 0c80837a838..a819073743c 100644 --- a/crates/swc_ecma_transforms_compat/tests/optional-chaining/general-member-access/output.js +++ b/crates/swc_ecma_transforms_compat/tests/optional-chaining/general-member-access/output.js @@ -1,4 +1,4 @@ -var _foo, _a_b_c, _a, _a_b_c_d, _a_b, _a_b_c_d1, _a_b_c1, _orders, _orders_, _orders1, _client, _orders_client_key, _a1, _c; +var _foo, _a_b_c, _a, _a_b_c_d, _a_b, _a_b_c_d1, _a_b_c1, _orders, _orders_, _orders1, _client, _orders_client_key, _a1, _c, _a2; (_foo = foo) === null || _foo === void 0 ? void 0 : _foo.bar; (_a = a) === null || _a === void 0 ? void 0 : (_a_b_c = _a.b.c) === null || _a_b_c === void 0 ? void 0 : _a_b_c.d.e; (_a_b = a.b) === null || _a_b === void 0 ? void 0 : (_a_b_c_d = _a_b.c.d) === null || _a_b_c_d === void 0 ? void 0 : _a_b_c_d.e; @@ -8,4 +8,4 @@ var _foo, _a_b_c, _a, _a_b_c_d, _a_b, _a_b_c_d1, _a_b_c1, _orders, _orders_, _or orders[(_client = client) === null || _client === void 0 ? void 0 : _client.key].price; (_orders_client_key = orders[client.key]) === null || _orders_client_key === void 0 ? void 0 : _orders_client_key.price; (0, (_a1 = a) === null || _a1 === void 0 ? void 0 : _a1.b).c; -(0, (_c = (0, a?.b).c) === null || _c === void 0 ? void 0 : _c.d).e; +(0, (_c = (0, (_a2 = a) === null || _a2 === void 0 ? void 0 : _a2.b).c) === null || _c === void 0 ? void 0 : _c.d).e;