diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/rename-inside-switch/input.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/rename-inside-switch/input.js new file mode 100644 index 0000000000..69209434fb --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/rename-inside-switch/input.js @@ -0,0 +1,20 @@ +window.test = () => { + const e = "TEST"; + switch (e) { + case "TEST": + const e = []; + e.push('111'); + alert(e); + break; + default: alert('666'); break; + } +}; + +window.test = () => { + const e = "TEST"; + switch (e) { + case "TEST": + const e = []; + switch(e) {} + } +}; \ No newline at end of file diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/rename-inside-switch/output.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/rename-inside-switch/output.js new file mode 100644 index 0000000000..a6b82c4072 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/rename-inside-switch/output.js @@ -0,0 +1,29 @@ +window.test = function () { + var e = "TEST"; + + switch (e) { + case "TEST": + var _e = []; + + _e.push('111'); + + alert(_e); + break; + + default: + alert('666'); + break; + } +}; + +window.test = function () { + var e = "TEST"; + + switch (e) { + case "TEST": + var _e2 = []; + + switch (_e2) {} + + } +}; diff --git a/packages/babel-traverse/src/scope/lib/renamer.js b/packages/babel-traverse/src/scope/lib/renamer.js index 528c43ef4d..2b24795e17 100644 --- a/packages/babel-traverse/src/scope/lib/renamer.js +++ b/packages/babel-traverse/src/scope/lib/renamer.js @@ -119,7 +119,15 @@ export default class Renamer { } } - scope.traverse(block || scope.block, renameVisitor, this); + const blockToTraverse = block || scope.block; + if (blockToTraverse?.type === "SwitchStatement") { + // discriminant is not part of current scope, should be skipped. + blockToTraverse.cases.forEach(c => { + scope.traverse(c, renameVisitor, this); + }); + } else { + scope.traverse(blockToTraverse, renameVisitor, this); + } if (!block) { scope.removeOwnBinding(oldName);