Skip to content

Commit 4b33d41

Browse files
authoredAug 29, 2023
fix(es/compat): Make SwitchCase handler of block-scoping stateless (#7888)
**Related issue:** - Closes #7885
1 parent 4a2c24b commit 4b33d41

File tree

5 files changed

+64
-8
lines changed

5 files changed

+64
-8
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"jsc": {
3+
"parser": {
4+
"syntax": "typescript",
5+
"tsx": false
6+
},
7+
"target": "es5",
8+
"loose": false,
9+
"minify": {
10+
"compress": false,
11+
"mangle": false
12+
}
13+
},
14+
"module": {
15+
"type": "es6"
16+
},
17+
"minify": false,
18+
"isModule": true
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export const loopError = () => {
2+
const stack: number[] = [1];
3+
while (stack.shift() !== undefined) {
4+
const object = 1;
5+
[].map((): number => object);
6+
}
7+
const kind = 0;
8+
switch (kind) {
9+
case 0:
10+
break;
11+
}
12+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export var loopError = function() {
2+
var _loop = function() {
3+
var object = 1;
4+
[].map(function() {
5+
return object;
6+
});
7+
};
8+
var stack = [
9+
1
10+
];
11+
while(stack.shift() !== undefined)_loop();
12+
var kind = 0;
13+
switch(kind){
14+
case 0:
15+
break;
16+
}
17+
};

‎crates/swc_ecma_transforms_compat/src/es2015/block_scoping/mod.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -431,13 +431,6 @@ impl VisitMut for BlockScoping {
431431
self.handle_capture_of_vars(&mut node.body);
432432
}
433433

434-
fn visit_mut_while_stmt(&mut self, node: &mut WhileStmt) {
435-
self.visit_mut_with_scope(ScopeKind::new_loop(), &mut node.body);
436-
437-
node.test.visit_mut_with(self);
438-
self.handle_capture_of_vars(&mut node.body);
439-
}
440-
441434
fn visit_mut_for_in_stmt(&mut self, node: &mut ForInStmt) {
442435
let blockifyed = self.blockify_for_stmt_body(&mut node.body);
443436
let lexical_var = if let ForHead::VarDecl(decl) = &node.left {
@@ -544,6 +537,14 @@ impl VisitMut for BlockScoping {
544537
self.visit_mut_stmt_like(n);
545538
}
546539

540+
fn visit_mut_switch_case(&mut self, n: &mut SwitchCase) {
541+
let old_vars = self.vars.take();
542+
543+
n.visit_mut_children_with(self);
544+
545+
self.vars = old_vars;
546+
}
547+
547548
fn visit_mut_var_decl(&mut self, var: &mut VarDecl) {
548549
let old = self.var_decl_kind;
549550
self.var_decl_kind = var.kind;
@@ -569,6 +570,13 @@ impl VisitMut for BlockScoping {
569570
}
570571
}
571572
}
573+
574+
fn visit_mut_while_stmt(&mut self, node: &mut WhileStmt) {
575+
self.visit_mut_with_scope(ScopeKind::new_loop(), &mut node.body);
576+
577+
node.test.visit_mut_with(self);
578+
self.handle_capture_of_vars(&mut node.body);
579+
}
572580
}
573581

574582
impl BlockScoping {

‎crates/swc_ecma_transforms_compat/src/es2015/for_of.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ impl VisitMut for ForOf {
670670
*s = self.fold_for_stmt(Some(label.clone()), stmt.take());
671671
}
672672
_ => {
673-
body.visit_mut_children_with(self);
673+
body.visit_mut_with(self);
674674
}
675675
}
676676
}

0 commit comments

Comments
 (0)