From 5cf4bf21ee3a4921849b612b5e3a5ad5cbf37483 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sun, 20 Nov 2022 18:39:59 +0800 Subject: [PATCH 1/2] fix(es/codegen): Preserve parentheses for new expr in optional chaining --- .../fixture/issues-6xxx/6438/input/.swcrc | 72 +++++++++++++++++++ .../fixture/issues-6xxx/6438/input/index.js | 1 + .../fixture/issues-6xxx/6438/output/index.js | 1 + crates/swc_ecma_codegen/src/lib.rs | 12 ++-- 4 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 crates/swc/tests/fixture/issues-6xxx/6438/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-6xxx/6438/input/index.js create mode 100644 crates/swc/tests/fixture/issues-6xxx/6438/output/index.js diff --git a/crates/swc/tests/fixture/issues-6xxx/6438/input/.swcrc b/crates/swc/tests/fixture/issues-6xxx/6438/input/.swcrc new file mode 100644 index 000000000000..6f7554d71d21 --- /dev/null +++ b/crates/swc/tests/fixture/issues-6xxx/6438/input/.swcrc @@ -0,0 +1,72 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic", + "importSource": "preact", + "development": true + } + }, + "target": "es2022", + "loose": false, + "minify": { + "compress": { + "arguments": false, + "arrows": true, + "booleans": true, + "booleans_as_integers": false, + "collapse_vars": true, + "comparisons": true, + "computed_props": true, + "conditionals": true, + "dead_code": true, + "directives": true, + "drop_console": false, + "drop_debugger": true, + "evaluate": true, + "expression": false, + "hoist_funs": false, + "hoist_props": true, + "hoist_vars": false, + "if_return": true, + "join_vars": true, + "keep_classnames": false, + "keep_fargs": true, + "keep_fnames": false, + "keep_infinity": false, + "loops": true, + "negate_iife": true, + "properties": true, + "reduce_funcs": false, + "reduce_vars": false, + "side_effects": true, + "switches": true, + "typeofs": true, + "unsafe": false, + "unsafe_arrows": false, + "unsafe_comps": false, + "unsafe_Function": false, + "unsafe_math": false, + "unsafe_symbols": false, + "unsafe_methods": false, + "unsafe_proto": false, + "unsafe_regexp": false, + "unsafe_undefined": false, + "unused": true, + "const_to_let": true, + "pristine_globals": true, + "passes": 2 + }, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": true, + "isModule": true +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-6xxx/6438/input/index.js b/crates/swc/tests/fixture/issues-6xxx/6438/input/index.js new file mode 100644 index 000000000000..6e45f4deee3b --- /dev/null +++ b/crates/swc/tests/fixture/issues-6xxx/6438/input/index.js @@ -0,0 +1 @@ +new Date()?.toLocaleDateString() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-6xxx/6438/output/index.js b/crates/swc/tests/fixture/issues-6xxx/6438/output/index.js new file mode 100644 index 000000000000..2dac17589ef3 --- /dev/null +++ b/crates/swc/tests/fixture/issues-6xxx/6438/output/index.js @@ -0,0 +1 @@ +new Date()?.toLocaleDateString(); diff --git a/crates/swc_ecma_codegen/src/lib.rs b/crates/swc_ecma_codegen/src/lib.rs index 0d273d1b9242..acc1588b5e38 100644 --- a/crates/swc_ecma_codegen/src/lib.rs +++ b/crates/swc_ecma_codegen/src/lib.rs @@ -810,7 +810,11 @@ where match n.base { OptChainBase::Member(ref e) => { - emit!(e.obj); + if let Expr::New(new) = &*e.obj { + self.emit_new(new, false)?; + } else { + emit!(e.obj); + } punct!("?."); match &e.prop { @@ -820,11 +824,7 @@ where } } OptChainBase::Call(ref e) => { - if let Expr::New(new) = &*e.callee { - self.emit_new(new, false)?; - } else { - emit!(e.callee); - } + emit!(e.callee); punct!("?."); punct!("("); From cc050941493e5e4f936959c055165c7870efccde Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sun, 20 Nov 2022 20:23:18 +0800 Subject: [PATCH 2/2] chore: add debug_assert --- crates/swc_ecma_codegen/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/swc_ecma_codegen/src/lib.rs b/crates/swc_ecma_codegen/src/lib.rs index acc1588b5e38..21b76e4d2134 100644 --- a/crates/swc_ecma_codegen/src/lib.rs +++ b/crates/swc_ecma_codegen/src/lib.rs @@ -824,6 +824,7 @@ where } } OptChainBase::Call(ref e) => { + debug_assert!(!e.callee.is_new()); emit!(e.callee); punct!("?.");