Skip to content

Commit

Permalink
fix(do-expr): SwitchStatement with IfStatement cases (#11728)
Browse files Browse the repository at this point in the history
* test(do-expr): condition before break

* test(do-expr): labeled break

* fix(do-expr): add check for break in BlockStatement

* fix(do-expr): add LabeledStatement case for getCompletionRecords

* test(do-expr): rename condition before break to condition before expression

* revert(do-expr): undo remove break for do switch

* revert(do-expr): undo remove labeled break

* test(do-expr): add condition before break

* test(do-expr): update condition before break

* test(do-expr): remove labeled break

* fix(do-expr): add tree search in findBreak

* fix(do-expr): ignore isFunction case in findBreak
  • Loading branch information
barronwei committed Sep 18, 2020
1 parent 44f8287 commit 1a8e7ff
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 14 deletions.
@@ -0,0 +1,10 @@
const x = (n) => do {
switch (n) {
case 0:
if (true) {
break;
}
}
}

expect(x(0)).toBe(undefined);
@@ -0,0 +1,8 @@
const x = (n) => do {
switch (n) {
case 0:
if (true) {
break;
}
}
}
@@ -0,0 +1,6 @@
const x = n => function () {
switch (n) {
case 0:
if (true) return void 0;
}
}();
@@ -0,0 +1,10 @@
const x = (n) => do {
switch (n) {
case 0:
if (true) {
'out';
break;
}

}
}
@@ -0,0 +1,9 @@
const x = n => function () {
switch (n) {
case 0:
if (true) {
return 'out';
}

}
}();
49 changes: 35 additions & 14 deletions packages/babel-traverse/src/path/family.js
Expand Up @@ -18,27 +18,48 @@ 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;

for (let i = cases.length - 1; i >= 0; i--) {
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 (
Expand Down

0 comments on commit 1a8e7ff

Please sign in to comment.