diff --git a/crates/swc_ecma_minifier/tests/terser/compress/dead_code/dead_code_2_should_warn_strict/output.js b/crates/swc_ecma_minifier/tests/terser/compress/dead_code/dead_code_2_should_warn_strict/output.js index dc2a7837aef9..32add590e3d2 100644 --- a/crates/swc_ecma_minifier/tests/terser/compress/dead_code/dead_code_2_should_warn_strict/output.js +++ b/crates/swc_ecma_minifier/tests/terser/compress/dead_code/dead_code_2_should_warn_strict/output.js @@ -1,6 +1,6 @@ "use strict"; function f() { - var x, g; + var x, g1; g(); x = 10; throw Error("foo"); diff --git a/crates/swc_ecma_minifier/tests/terser/compress/dead_code/dead_code_2_should_warn_strict/output.mangleOnly.js b/crates/swc_ecma_minifier/tests/terser/compress/dead_code/dead_code_2_should_warn_strict/output.mangleOnly.js index 2800760b4f53..e6063df3a82c 100644 --- a/crates/swc_ecma_minifier/tests/terser/compress/dead_code/dead_code_2_should_warn_strict/output.mangleOnly.js +++ b/crates/swc_ecma_minifier/tests/terser/compress/dead_code/dead_code_2_should_warn_strict/output.mangleOnly.js @@ -1,6 +1,6 @@ "use strict"; function n() { - o(); + g(); n = 10; throw new Error("foo"); if (n) { diff --git a/crates/swc_ecma_transforms_base/src/resolver/mod.rs b/crates/swc_ecma_transforms_base/src/resolver/mod.rs index ee704fb36ae0..5b3ae1cd178f 100644 --- a/crates/swc_ecma_transforms_base/src/resolver/mod.rs +++ b/crates/swc_ecma_transforms_base/src/resolver/mod.rs @@ -558,11 +558,14 @@ impl<'a> VisitMut for Resolver<'a> { child.mark_block(&mut s.span); let old_strict_mode = child.strict_mode; - child.strict_mode = s - .stmts - .first() - .map(|stmt| stmt.is_use_strict()) - .unwrap_or(false); + + if !child.strict_mode { + child.strict_mode = s + .stmts + .first() + .map(|stmt| stmt.is_use_strict()) + .unwrap_or(false); + } // Prevent creating new scope. s.stmts.visit_mut_with(child); child.strict_mode = old_strict_mode; @@ -901,11 +904,13 @@ impl<'a> VisitMut for Resolver<'a> { Some(body) => { self.mark_block(&mut body.span); let old_strict_mode = self.strict_mode; - self.strict_mode = body - .stmts - .first() - .map(|stmt| stmt.is_use_strict()) - .unwrap_or(false); + if !self.strict_mode { + self.strict_mode = body + .stmts + .first() + .map(|stmt| stmt.is_use_strict()) + .unwrap_or(false); + } // Prevent creating new scope. body.visit_mut_children_with(self); self.strict_mode = old_strict_mode; diff --git a/crates/swc_ecma_transforms_base/tests/fixture.rs b/crates/swc_ecma_transforms_base/tests/fixture.rs index 6b79194a1fdc..d5ef8a4328c3 100644 --- a/crates/swc_ecma_transforms_base/tests/fixture.rs +++ b/crates/swc_ecma_transforms_base/tests/fixture.rs @@ -10,7 +10,7 @@ use swc_ecma_visit::{ }; use testing::{fixture, run_test2, NormalizedOutput}; -pub fn print(cm: Lrc, module: &Module) -> String { +pub fn print(cm: Lrc, program: &Program) -> String { let mut buf = vec![]; { let mut emitter = Emitter { @@ -23,7 +23,7 @@ pub fn print(cm: Lrc, module: &Module) -> String { }; // println!("Emitting: {:?}", module); - emitter.emit_module(module).unwrap(); + emitter.emit_program(program).unwrap(); } let s = String::from_utf8_lossy(&buf); @@ -47,15 +47,15 @@ where let lexer = Lexer::new(syntax, EsVersion::latest(), StringInput::from(&*fm), None); let mut parser = Parser::new_from(lexer); - let module = parser - .parse_module() + let program = parser + .parse_program() .map_err(|err| err.into_diagnostic(&handler).emit())?; let mut folder = op(); - let module = module.fold_with(&mut folder); + let program = program.fold_with(&mut folder); - let actual = print(cm, &module); + let actual = print(cm, &program); let actual = NormalizedOutput::from(actual); actual.compare_to_file(&output).unwrap(); diff --git a/crates/swc_ecma_transforms_base/tests/resolver/function/block/input.js b/crates/swc_ecma_transforms_base/tests/resolver/function/block/input.js new file mode 100644 index 000000000000..5f97fb21ee0c --- /dev/null +++ b/crates/swc_ecma_transforms_base/tests/resolver/function/block/input.js @@ -0,0 +1,12 @@ +export function k() { + function x() { + console.log("hi"); + } + { + function x() { + console.log("merong"); + } + } + return x; +} +k(); diff --git a/crates/swc_ecma_transforms_base/tests/resolver/function/block/output.js b/crates/swc_ecma_transforms_base/tests/resolver/function/block/output.js new file mode 100644 index 000000000000..ce93ac3cf1e6 --- /dev/null +++ b/crates/swc_ecma_transforms_base/tests/resolver/function/block/output.js @@ -0,0 +1,12 @@ +export function k__2() { + function x__3() { + console.log("hi"); + } + { + function x__5() { + console.log("merong"); + } + } + return x__3; +} +k__2(); diff --git a/crates/swc_ecma_transforms_base/tests/resolver/issues/6310/output.js b/crates/swc_ecma_transforms_base/tests/resolver/issues/6310/output.js index ce7f15e2200b..fd64c79f66a5 100644 --- a/crates/swc_ecma_transforms_base/tests/resolver/issues/6310/output.js +++ b/crates/swc_ecma_transforms_base/tests/resolver/issues/6310/output.js @@ -1,4 +1,4 @@ switch(0){ - case x__3: - function x__3() {} + case x__2: + function x__2() {} } diff --git a/crates/swc_ecma_transforms_base/tests/resolver/issues/7685/output.js b/crates/swc_ecma_transforms_base/tests/resolver/issues/7685/output.js index fcfeaf2b43ae..a31e62c38bca 100644 --- a/crates/swc_ecma_transforms_base/tests/resolver/issues/7685/output.js +++ b/crates/swc_ecma_transforms_base/tests/resolver/issues/7685/output.js @@ -2,4 +2,4 @@ var NaN__2 = 1; { let NaN__3 = 1; console.log(NaN__3); -}console.log(NaN__2); +}console.log(NaN); diff --git a/crates/swc_ecma_transforms_base/tests/resolver/minifier/10/output.js b/crates/swc_ecma_transforms_base/tests/resolver/minifier/10/output.js index 1c7a9c4c44ed..ef647e6cd5ae 100644 --- a/crates/swc_ecma_transforms_base/tests/resolver/minifier/10/output.js +++ b/crates/swc_ecma_transforms_base/tests/resolver/minifier/10/output.js @@ -1,2 +1,2 @@ var NaN__2; -console.log(NaN__2.toString()); +console.log(NaN.toString()); diff --git a/crates/swc_ecma_transforms_base/tests/resolver/minifier/11/output.js b/crates/swc_ecma_transforms_base/tests/resolver/minifier/11/output.js index 9e66877fa246..3c827c9dcef3 100644 --- a/crates/swc_ecma_transforms_base/tests/resolver/minifier/11/output.js +++ b/crates/swc_ecma_transforms_base/tests/resolver/minifier/11/output.js @@ -1,2 +1,2 @@ var NaN__2 = 5; -console.log(NaN__2.toString()); +console.log(NaN.toString());