From aec5cdacc64296269d4c75f834d2a3021ca2db4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sat, 15 Oct 2022 18:11:20 +0900 Subject: [PATCH] fix(es/minifier): Preserve `this` of tagged template literals (#6165) **Related issue:** - Closes https://github.com/swc-project/swc/issues/6146 --- .../src/compress/optimize/mod.rs | 12 +++++++++++- .../tests/fixture/issues/6146/input.js | 6 ++++++ .../tests/fixture/issues/6146/output.js | 6 ++++++ .../tests/fixture/issues/vercel/007/output.js | 2 +- .../tagged_call_with_invalid_escape_2/output.js | 2 +- .../src/simplify/expr/mod.rs | 16 +++++++++++++++- 6 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/6146/input.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/6146/output.js diff --git a/crates/swc_ecma_minifier/src/compress/optimize/mod.rs b/crates/swc_ecma_minifier/src/compress/optimize/mod.rs index 9c5b8797cb59..1107fb0829fc 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/mod.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/mod.rs @@ -2263,12 +2263,19 @@ where .enumerate() .identify_last() .filter_map(|(last, (idx, expr))| { + #[cfg(feature = "debug")] + let _span = + tracing::span!(tracing::Level::ERROR, "seq_expr_with_children").entered(); + expr.visit_mut_with(&mut *self.with_ctx(ctx)); let is_injected_zero = match &**expr { Expr::Lit(Lit::Num(v)) => v.span.is_dummy(), _ => false, }; + #[cfg(feature = "debug")] + let _span = tracing::span!(tracing::Level::ERROR, "seq_expr").entered(); + let can_remove = !last && (idx != 0 || !is_injected_zero @@ -2580,7 +2587,10 @@ where /// We don't optimize [Tpl] contained in [TaggedTpl]. #[cfg_attr(feature = "debug", tracing::instrument(skip_all))] fn visit_mut_tagged_tpl(&mut self, n: &mut TaggedTpl) { - n.tag.visit_mut_with(self); + n.tag.visit_mut_with(&mut *self.with_ctx(Ctx { + is_this_aware_callee: true, + ..self.ctx + })); n.tpl.exprs.visit_mut_with(self); } diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/6146/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/6146/input.js new file mode 100644 index 000000000000..0d795027e77e --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/6146/input.js @@ -0,0 +1,6 @@ +let o = { + f() { + assert.ok(this !== o); + } +}; +(1, o.f)``; \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/6146/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/6146/output.js new file mode 100644 index 000000000000..4dc21d51f806 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/6146/output.js @@ -0,0 +1,6 @@ +let o = { + f () { + assert.ok(this !== o); + } +}; +(0, o.f)``; diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/vercel/007/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/vercel/007/output.js index 446e71b9e6d9..e5c2190d9753 100644 --- a/crates/swc_ecma_minifier/tests/fixture/issues/vercel/007/output.js +++ b/crates/swc_ecma_minifier/tests/fixture/issues/vercel/007/output.js @@ -9,7 +9,7 @@ import _JSXStyle from "styled-jsx/style"; top ? "column" : "column-reverse" ] ] - ]), _JSXStyle.dynamic([ + ]), Sidebar, _JSXStyle.dynamic([ [ "4507deac72c40d6c", [ diff --git a/crates/swc_ecma_minifier/tests/terser/compress/template_string/tagged_call_with_invalid_escape_2/output.js b/crates/swc_ecma_minifier/tests/terser/compress/template_string/tagged_call_with_invalid_escape_2/output.js index 0e7fd3a3442c..1211727ddec4 100644 --- a/crates/swc_ecma_minifier/tests/terser/compress/template_string/tagged_call_with_invalid_escape_2/output.js +++ b/crates/swc_ecma_minifier/tests/terser/compress/template_string/tagged_call_with_invalid_escape_2/output.js @@ -1,3 +1,3 @@ console.log(({ y: ()=>String.raw -}).y()`\4321\u\x`), console.log(String.raw`\4321\u\x`); +}).y()`\4321\u\x`), console.log((0, String.raw)`\4321\u\x`); diff --git a/crates/swc_ecma_transforms_optimization/src/simplify/expr/mod.rs b/crates/swc_ecma_transforms_optimization/src/simplify/expr/mod.rs index 991a16603612..d77fe755fba6 100644 --- a/crates/swc_ecma_transforms_optimization/src/simplify/expr/mod.rs +++ b/crates/swc_ecma_transforms_optimization/src/simplify/expr/mod.rs @@ -1504,7 +1504,9 @@ impl VisitMut for SimplifyExpr { } } - Expr::Lit(..) | Expr::Ident(..) if self.in_callee => { + Expr::Lit(..) | Expr::Ident(..) + if self.in_callee && !expr.may_have_side_effects(&self.expr_ctx) => + { if exprs.is_empty() { self.changed = true; @@ -1584,6 +1586,18 @@ impl VisitMut for SimplifyExpr { self.is_modifying = old; } + fn visit_mut_tagged_tpl(&mut self, n: &mut TaggedTpl) { + let old = self.in_callee; + self.in_callee = true; + + n.tag.visit_mut_with(self); + + self.in_callee = false; + n.tpl.visit_mut_with(self); + + self.in_callee = old; + } + fn visit_mut_with_stmt(&mut self, n: &mut WithStmt) { n.obj.visit_mut_with(self); }