Skip to content

Commit 7b9ac54

Browse files
author
Andy Hanson
committed
Add code fix to remove unreachable code
1 parent ff177f0 commit 7b9ac54

File tree

8 files changed

+96
-0
lines changed

8 files changed

+96
-0
lines changed

src/compiler/diagnosticMessages.json

+8
Original file line numberDiff line numberDiff line change
@@ -4245,5 +4245,13 @@
42454245
"Convert all 'require' to 'import'": {
42464246
"category": "Message",
42474247
"code": 95048
4248+
},
4249+
"Remove unreachable code": {
4250+
"category": "Message",
4251+
"code": 95049
4252+
},
4253+
"Remove all unreachable code": {
4254+
"category": "Message",
4255+
"code": 95050
42484256
}
42494257
}

src/harness/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
"../services/codefixes/fixExtendsInterfaceBecomesImplements.ts",
106106
"../services/codefixes/fixForgottenThisPropertyAccess.ts",
107107
"../services/codefixes/fixUnusedIdentifier.ts",
108+
"../services/codefixes/fixUnreachableCode.ts",
108109
"../services/codefixes/fixJSDocTypes.ts",
109110
"../services/codefixes/fixAwaitInSyncFunction.ts",
110111
"../services/codefixes/disableJsDiagnostics.ts",

src/server/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
"../services/codefixes/fixExtendsInterfaceBecomesImplements.ts",
102102
"../services/codefixes/fixForgottenThisPropertyAccess.ts",
103103
"../services/codefixes/fixUnusedIdentifier.ts",
104+
"../services/codefixes/fixUnreachableCode.ts",
104105
"../services/codefixes/fixJSDocTypes.ts",
105106
"../services/codefixes/fixAwaitInSyncFunction.ts",
106107
"../services/codefixes/disableJsDiagnostics.ts",

src/server/tsconfig.library.json

+1
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
"../services/codefixes/fixExtendsInterfaceBecomesImplements.ts",
108108
"../services/codefixes/fixForgottenThisPropertyAccess.ts",
109109
"../services/codefixes/fixUnusedIdentifier.ts",
110+
"../services/codefixes/fixUnreachableCode.ts",
110111
"../services/codefixes/fixJSDocTypes.ts",
111112
"../services/codefixes/fixAwaitInSyncFunction.ts",
112113
"../services/codefixes/disableJsDiagnostics.ts",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/* @internal */
2+
namespace ts.codefix {
3+
const fixId = "fixUnreachableCode";
4+
const errorCodes = [Diagnostics.Unreachable_code_detected.code];
5+
registerCodeFix({
6+
errorCodes,
7+
getCodeActions: context => {
8+
const { sourceFile, span } = context;
9+
const changes = textChanges.ChangeTracker.with(context, t => t.deleteNode(sourceFile, getStatement(sourceFile, span.start)));
10+
return [createCodeFixAction(fixId, changes, Diagnostics.Remove_unreachable_code, fixId, Diagnostics.Remove_all_unreachable_code)];
11+
},
12+
fixIds: [fixId],
13+
getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, diag) => {
14+
changes.deleteNode(diag.file, getStatement(diag.file, diag.start));
15+
}),
16+
});
17+
18+
function getStatement(sourceFile: SourceFile, start: number): Statement {
19+
const token = getTokenAtPosition(sourceFile, start, /*includeJsDocComment*/ false);
20+
let statement = findAncestor(token, isStatement);
21+
Debug.assert(statement.getStart(sourceFile) === token.getStart(sourceFile));
22+
if (isBlock(statement.parent)) statement = statement.parent;
23+
switch (statement.parent.kind) {
24+
case SyntaxKind.IfStatement:
25+
return (statement.parent as IfStatement).elseStatement ? statement : statement.parent as IfStatement;
26+
case SyntaxKind.WhileStatement:
27+
case SyntaxKind.ForStatement:
28+
return statement.parent as WhileStatement | ForStatement;
29+
default:
30+
return statement;
31+
}
32+
}
33+
}

src/services/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
"codefixes/fixExtendsInterfaceBecomesImplements.ts",
9999
"codefixes/fixForgottenThisPropertyAccess.ts",
100100
"codefixes/fixUnusedIdentifier.ts",
101+
"codefixes/fixUnreachableCode.ts",
101102
"codefixes/fixJSDocTypes.ts",
102103
"codefixes/fixAwaitInSyncFunction.ts",
103104
"codefixes/disableJsDiagnostics.ts",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////function f() {
4+
//// return 0;
5+
//// return 1;
6+
////}
7+
8+
verify.codeFix({
9+
description: "Remove unreachable code",
10+
newFileContent:
11+
`function f() {
12+
return 0;
13+
}`,
14+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////if (false) a;
4+
////if (false) {
5+
//// a;
6+
////}
7+
////
8+
////// No good way to delete just the 'if' part
9+
////if (false) {
10+
//// a;
11+
////} else {
12+
//// b;
13+
////}
14+
////
15+
////while (false) a;
16+
////while (false) {
17+
//// a;
18+
////}
19+
////
20+
////for (let x = 0; false; ++x) a;
21+
////for (let x = 0; false; ++x) {
22+
//// a;
23+
////}
24+
25+
verify.codeFixAll({
26+
fixId: "fixUnreachableCode",
27+
fixAllDescription: "Remove all unreachable code",
28+
newFileContent:
29+
`
30+
// No good way to delete just the 'if' part
31+
if (false) else {
32+
b;
33+
}
34+
35+
36+
`,
37+
});

0 commit comments

Comments
 (0)