diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js new file mode 100644 index 000000000000..27bba05a969d --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/exec.js @@ -0,0 +1,10 @@ +const x = (n) => do { + switch (n) { + case 0: + if (true) { + break; + } + } +} + +expect(x(0)).toBe(undefined); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js new file mode 100644 index 000000000000..febf6add8206 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/input.js @@ -0,0 +1,8 @@ +const x = (n) => do { + switch (n) { + case 0: + if (true) { + break; + } + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js new file mode 100644 index 000000000000..6f8a8e2dcec0 --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-break/output.js @@ -0,0 +1,6 @@ +const x = n => function () { + switch (n) { + case 0: + if (true) return void 0; + } +}(); diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/input.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/input.js new file mode 100644 index 000000000000..deb5891d784b --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/input.js @@ -0,0 +1,10 @@ +const x = (n) => do { + switch (n) { + case 0: + if (true) { + 'out'; + break; + } + + } +} diff --git a/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/output.js b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/output.js new file mode 100644 index 000000000000..f0acfbbfad1b --- /dev/null +++ b/packages/babel-plugin-proposal-do-expressions/test/fixtures/do-expression-switch-case/condition-before-expression/output.js @@ -0,0 +1,9 @@ +const x = n => function () { + switch (n) { + case 0: + if (true) { + return 'out'; + } + + } +}(); diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index b2d9cefc4e1b..6b5743384a68 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -18,6 +18,40 @@ function addCompletionRecords(path, paths) { return paths; } +function findBreak(statements): ?NodePath { + let breakStatement; + if (!Array.isArray(statements)) { + statements = [statements]; + } + + for (const statement of statements) { + if ( + statement.isDoExpression() || + statement.isProgram() || + statement.isBlockStatement() || + statement.isCatchClause() || + statement.isLabeledStatement() + ) { + breakStatement = findBreak(statement.get("body")); + } else if (statement.isIfStatement()) { + breakStatement = + findBreak(statement.get("consequent")) ?? + findBreak(statement.get("alternate")); + } else if (statement.isTryStatement()) { + breakStatement = + findBreak(statement.get("block")) ?? + findBreak(statement.get("handler")); + } else if (statement.isBreakStatement()) { + breakStatement = statement; + } + + if (breakStatement) { + return breakStatement; + } + } + return null; +} + function completionRecordForSwitch(cases, paths) { let isLastCaseWithConsequent = true; @@ -25,20 +59,7 @@ function completionRecordForSwitch(cases, paths) { const switchCase = cases[i]; const consequent = switchCase.get("consequent"); - let breakStatement; - findBreak: for (const statement of consequent) { - if (statement.isBlockStatement()) { - for (const statementInBlock of statement.get("body")) { - if (statementInBlock.isBreakStatement()) { - breakStatement = statementInBlock; - break findBreak; - } - } - } else if (statement.isBreakStatement()) { - breakStatement = statement; - break; - } - } + let breakStatement = findBreak(consequent); if (breakStatement) { while (