From 4b33d41fabf841dfc31c6f44d94e4651239ab667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 29 Aug 2023 14:45:13 +0900 Subject: [PATCH] fix(es/compat): Make `SwitchCase` handler of `block-scoping` stateless (#7888) **Related issue:** - Closes #7885 --- .../fixture/issues-7xxx/7885/input/.swcrc | 19 ++++++++++++++++ .../tests/fixture/issues-7xxx/7885/input/1.js | 12 ++++++++++ .../fixture/issues-7xxx/7885/output/1.js | 17 ++++++++++++++ .../src/es2015/block_scoping/mod.rs | 22 +++++++++++++------ .../src/es2015/for_of.rs | 2 +- 5 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 crates/swc/tests/fixture/issues-7xxx/7885/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-7xxx/7885/input/1.js create mode 100644 crates/swc/tests/fixture/issues-7xxx/7885/output/1.js diff --git a/crates/swc/tests/fixture/issues-7xxx/7885/input/.swcrc b/crates/swc/tests/fixture/issues-7xxx/7885/input/.swcrc new file mode 100644 index 000000000000..887e89d7affc --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7885/input/.swcrc @@ -0,0 +1,19 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": false + }, + "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/7885/input/1.js b/crates/swc/tests/fixture/issues-7xxx/7885/input/1.js new file mode 100644 index 000000000000..d4574a17ba8a --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7885/input/1.js @@ -0,0 +1,12 @@ +export const loopError = () => { + const stack: number[] = [1]; + while (stack.shift() !== undefined) { + const object = 1; + [].map((): number => object); + } + const kind = 0; + switch (kind) { + case 0: + break; + } +}; \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-7xxx/7885/output/1.js b/crates/swc/tests/fixture/issues-7xxx/7885/output/1.js new file mode 100644 index 000000000000..5f673180859c --- /dev/null +++ b/crates/swc/tests/fixture/issues-7xxx/7885/output/1.js @@ -0,0 +1,17 @@ +export var loopError = function() { + var _loop = function() { + var object = 1; + [].map(function() { + return object; + }); + }; + var stack = [ + 1 + ]; + while(stack.shift() !== undefined)_loop(); + var kind = 0; + switch(kind){ + case 0: + break; + } +}; diff --git a/crates/swc_ecma_transforms_compat/src/es2015/block_scoping/mod.rs b/crates/swc_ecma_transforms_compat/src/es2015/block_scoping/mod.rs index 4c80ceefd3dd..ce18711f7e35 100644 --- a/crates/swc_ecma_transforms_compat/src/es2015/block_scoping/mod.rs +++ b/crates/swc_ecma_transforms_compat/src/es2015/block_scoping/mod.rs @@ -431,13 +431,6 @@ impl VisitMut for BlockScoping { self.handle_capture_of_vars(&mut node.body); } - fn visit_mut_while_stmt(&mut self, node: &mut WhileStmt) { - self.visit_mut_with_scope(ScopeKind::new_loop(), &mut node.body); - - node.test.visit_mut_with(self); - self.handle_capture_of_vars(&mut node.body); - } - fn visit_mut_for_in_stmt(&mut self, node: &mut ForInStmt) { let blockifyed = self.blockify_for_stmt_body(&mut node.body); let lexical_var = if let ForHead::VarDecl(decl) = &node.left { @@ -544,6 +537,14 @@ impl VisitMut for BlockScoping { self.visit_mut_stmt_like(n); } + fn visit_mut_switch_case(&mut self, n: &mut SwitchCase) { + let old_vars = self.vars.take(); + + n.visit_mut_children_with(self); + + self.vars = old_vars; + } + fn visit_mut_var_decl(&mut self, var: &mut VarDecl) { let old = self.var_decl_kind; self.var_decl_kind = var.kind; @@ -569,6 +570,13 @@ impl VisitMut for BlockScoping { } } } + + fn visit_mut_while_stmt(&mut self, node: &mut WhileStmt) { + self.visit_mut_with_scope(ScopeKind::new_loop(), &mut node.body); + + node.test.visit_mut_with(self); + self.handle_capture_of_vars(&mut node.body); + } } impl BlockScoping { diff --git a/crates/swc_ecma_transforms_compat/src/es2015/for_of.rs b/crates/swc_ecma_transforms_compat/src/es2015/for_of.rs index b5094439342b..d7ddb6be3842 100644 --- a/crates/swc_ecma_transforms_compat/src/es2015/for_of.rs +++ b/crates/swc_ecma_transforms_compat/src/es2015/for_of.rs @@ -670,7 +670,7 @@ impl VisitMut for ForOf { *s = self.fold_for_stmt(Some(label.clone()), stmt.take()); } _ => { - body.visit_mut_children_with(self); + body.visit_mut_with(self); } } }