fix(do-expr): SwitchStatement with IfStatement cases (#11728)
* 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
This commit is contained in:
parent
44f8287d7a
commit
1a8e7ff2ec
@ -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';
|
||||
}
|
||||
|
||||
}
|
||||
}();
|
||||
@ -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 (
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user