Skip to content

Commit 27da9ea

Browse files
author
Andy
authored
fixUnreachableCode: Don't delete whole block when non-first line is unreachable (microsoft#25625)
1 parent 88c6ced commit 27da9ea

File tree

2 files changed

+52
-25
lines changed

2 files changed

+52
-25
lines changed

src/services/codefixes/fixUnreachableCode.ts

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,33 @@ namespace ts.codefix {
1818
Debug.assert(statement.getStart(sourceFile) === token.getStart(sourceFile));
1919

2020
const container = (isBlock(statement.parent) ? statement.parent : statement).parent;
21-
switch (container.kind) {
22-
case SyntaxKind.IfStatement:
23-
if ((container as IfStatement).elseStatement) {
24-
if (isBlock(statement.parent)) {
25-
changes.deleteNodeRange(sourceFile, first(statement.parent.statements), last(statement.parent.statements));
21+
if (!isBlock(statement.parent) || statement === first(statement.parent.statements)) {
22+
switch (container.kind) {
23+
case SyntaxKind.IfStatement:
24+
if ((container as IfStatement).elseStatement) {
25+
if (isBlock(statement.parent)) {
26+
break;
27+
}
28+
else {
29+
changes.replaceNode(sourceFile, statement, createBlock(emptyArray));
30+
}
31+
return;
2632
}
27-
else {
28-
changes.replaceNode(sourceFile, statement, createBlock(emptyArray));
29-
}
30-
break;
31-
}
32-
// falls through
33-
case SyntaxKind.WhileStatement:
34-
case SyntaxKind.ForStatement:
35-
changes.delete(sourceFile, container);
36-
break;
37-
default:
38-
if (isBlock(statement.parent)) {
39-
const end = start + length;
40-
const lastStatement = Debug.assertDefined(lastWhere(sliceAfter(statement.parent.statements, statement), s => s.pos < end));
41-
changes.deleteNodeRange(sourceFile, statement, lastStatement);
42-
}
43-
else {
44-
changes.delete(sourceFile, statement);
45-
}
33+
// falls through
34+
case SyntaxKind.WhileStatement:
35+
case SyntaxKind.ForStatement:
36+
changes.delete(sourceFile, container);
37+
return;
38+
}
39+
}
40+
41+
if (isBlock(statement.parent)) {
42+
const end = start + length;
43+
const lastStatement = Debug.assertDefined(lastWhere(sliceAfter(statement.parent.statements, statement), s => s.pos < end));
44+
changes.deleteNodeRange(sourceFile, statement, lastStatement);
45+
}
46+
else {
47+
changes.delete(sourceFile, statement);
4648
}
4749
}
4850

tests/cases/fourslash/codeFixUnreachableCode_if.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@
2222
////for (let x = 0; false; ++x) {
2323
//// a;
2424
////}
25+
////
26+
////while (true) {
27+
//// 1;
28+
//// break;
29+
//// 2;
30+
////}
31+
////
32+
////function f() {
33+
//// if (true) {
34+
//// 1;
35+
//// return;
36+
//// 2;
37+
//// }
38+
////}
2539

2640
verify.codeFixAll({
2741
fixId: "fixUnreachableCode",
@@ -36,5 +50,16 @@ if (false) {
3650
}
3751
3852
39-
`,
53+
54+
while (true) {
55+
1;
56+
break;
57+
}
58+
59+
function f() {
60+
if (true) {
61+
1;
62+
return;
63+
}
64+
}`,
4065
});

0 commit comments

Comments
 (0)