Skip to content

Commit 88b7948

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

File tree

8 files changed

+97
-0
lines changed

8 files changed

+97
-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,34 @@
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+
const statement = findAncestor(token, isStatement);
21+
Debug.assert(statement.getStart(sourceFile) === token.getStart(sourceFile));
22+
23+
const container = (isBlock(statement.parent) ? statement.parent : statement).parent;
24+
switch (container.kind) {
25+
case SyntaxKind.IfStatement:
26+
return (container as IfStatement).elseStatement ? statement : container as IfStatement;
27+
case SyntaxKind.WhileStatement:
28+
case SyntaxKind.ForStatement:
29+
return container as WhileStatement | ForStatement;
30+
default:
31+
return statement;
32+
}
33+
}
34+
}

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)