From 6f52949210ee2a71ed119cbcdf2db1842a2e63cb Mon Sep 17 00:00:00 2001 From: Austaras Date: Sat, 12 Oct 2024 15:07:08 +0800 Subject: [PATCH] fix(es/minifier): Only merge last if return (#9633) **Related issue:** - Closes https://github.com/swc-project/swc/issues/9628 --- .changeset/good-lions-design.md | 6 ++++++ .../src/compress/optimize/if_return.rs | 6 +++--- .../tests/fixture/issues/9628/input.js | 11 +++++++++++ .../tests/fixture/issues/9628/output.js | 1 + 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 .changeset/good-lions-design.md create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/9628/input.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/9628/output.js diff --git a/.changeset/good-lions-design.md b/.changeset/good-lions-design.md new file mode 100644 index 000000000000..15b155573d1e --- /dev/null +++ b/.changeset/good-lions-design.md @@ -0,0 +1,6 @@ +--- +swc_core: patch +swc_ecma_minifier: patch +--- + +fix(es/minifier): Only merge last if return diff --git a/crates/swc_ecma_minifier/src/compress/optimize/if_return.rs b/crates/swc_ecma_minifier/src/compress/optimize/if_return.rs index e5ad4d9de2b5..e7fe6b811c22 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/if_return.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/if_return.rs @@ -494,16 +494,16 @@ impl Optimizer<'_> { } } - fn can_merge_stmt_as_if_return(&self, s: &Stmt, _is_last: bool) -> bool { + fn can_merge_stmt_as_if_return(&self, s: &Stmt, is_last: bool) -> bool { // if !res { // trace!("Cannot merge: {}", dump(s)); // } match s { Stmt::Expr(..) => true, - Stmt::Return(..) => true, + Stmt::Return(..) => is_last, Stmt::Block(s) => { - s.stmts.len() == 1 && self.can_merge_stmt_as_if_return(&s.stmts[0], false) + s.stmts.len() == 1 && self.can_merge_stmt_as_if_return(&s.stmts[0], is_last) } Stmt::If(stmt) => { matches!(&*stmt.cons, Stmt::Return(..)) diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9628/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/9628/input.js new file mode 100644 index 000000000000..d72cd31502f7 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9628/input.js @@ -0,0 +1,11 @@ +const getString = () => { + switch ("apple") { + case "apple": + return "1"; + case "banana": + return "2"; + } + return "3"; +}; + +console.log(getString()); diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9628/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/9628/output.js new file mode 100644 index 000000000000..eaedf96c62f6 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9628/output.js @@ -0,0 +1 @@ +console.log("1");