From 0d1e1ee10c7f565635207fb1347e5018aae900d0 Mon Sep 17 00:00:00 2001 From: Adam Leventhal Date: Thu, 18 Aug 2016 07:14:07 -0700 Subject: [PATCH] incorrect handling of returns nested in switch cases (#3618) --- .../src/index.js | 12 ++++---- .../fixtures/general/superswitch/actual.js | 16 ++++++++++ .../fixtures/general/superswitch/expected.js | 29 +++++++++++++++++++ 3 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/actual.js create mode 100644 packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/expected.js diff --git a/packages/babel-plugin-transform-es2015-block-scoping/src/index.js b/packages/babel-plugin-transform-es2015-block-scoping/src/index.js index 380c8972f2..e2b005862d 100644 --- a/packages/babel-plugin-transform-es2015-block-scoping/src/index.js +++ b/packages/babel-plugin-transform-es2015-block-scoping/src/index.js @@ -684,11 +684,13 @@ class BlockScoping { single.consequent[0] )); } else { - // https://github.com/babel/babel/issues/998 - for (let i = 0; i < cases.length; i++) { - let caseConsequent = cases[i].consequent[0]; - if (t.isBreakStatement(caseConsequent) && !caseConsequent.label) { - caseConsequent.label = this.loopLabel = this.loopLabel || this.scope.generateUidIdentifier("loop"); + if (this.loop) { + // https://github.com/babel/babel/issues/998 + for (let i = 0; i < cases.length; i++) { + let caseConsequent = cases[i].consequent[0]; + if (t.isBreakStatement(caseConsequent) && !caseConsequent.label) { + caseConsequent.label = this.loopLabel = this.loopLabel || this.scope.generateUidIdentifier("loop"); + } } } diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/actual.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/actual.js new file mode 100644 index 0000000000..857b8641f4 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/actual.js @@ -0,0 +1,16 @@ +function foo() { + switch (2) { + case 0: { + if (true) { + return; + } + + const stuff = new Map(); + const data = 0; + stuff.forEach(() => { + const d = data; + }); + break; + } + } +} diff --git a/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/expected.js b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/expected.js new file mode 100644 index 0000000000..05d7afe3d9 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-block-scoping/test/fixtures/general/superswitch/expected.js @@ -0,0 +1,29 @@ +function foo() { + switch (2) { + case 0: + { + var _ret = function () { + if (true) { + return { + v: void 0 + }; + } + + var stuff = new Map(); + var data = 0; + stuff.forEach(function () { + var d = data; + }); + return "break"; + }(); + + switch (_ret) { + case "break": + break; + + default: + if (typeof _ret === "object") return _ret.v; + } + } + } +}