Skip to content

Commit 3eb66da

Browse files
author
Andy
authored
Add code fix to remove unused label (#24037)
* Add code fix to remove unused label * Test with trivia and fix indentation with dedented label
1 parent 1df7997 commit 3eb66da

File tree

8 files changed

+69
-0
lines changed

8 files changed

+69
-0
lines changed

src/compiler/diagnosticMessages.json

+8
Original file line numberDiff line numberDiff line change
@@ -4261,5 +4261,13 @@
42614261
"Add missing typeof": {
42624262
"category": "Message",
42634263
"code": 95052
4264+
},
4265+
"Remove unused label": {
4266+
"category": "Message",
4267+
"code": 95053
4268+
},
4269+
"Remove all unused labels": {
4270+
"category": "Message",
4271+
"code": 95054
42644272
}
42654273
}

src/harness/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
"../services/codefixes/fixForgottenThisPropertyAccess.ts",
107107
"../services/codefixes/fixUnusedIdentifier.ts",
108108
"../services/codefixes/fixUnreachableCode.ts",
109+
"../services/codefixes/fixUnusedLabel.ts",
109110
"../services/codefixes/fixJSDocTypes.ts",
110111
"../services/codefixes/fixAwaitInSyncFunction.ts",
111112
"../services/codefixes/disableJsDiagnostics.ts",

src/server/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
"../services/codefixes/fixForgottenThisPropertyAccess.ts",
103103
"../services/codefixes/fixUnusedIdentifier.ts",
104104
"../services/codefixes/fixUnreachableCode.ts",
105+
"../services/codefixes/fixUnusedLabel.ts",
105106
"../services/codefixes/fixJSDocTypes.ts",
106107
"../services/codefixes/fixAwaitInSyncFunction.ts",
107108
"../services/codefixes/disableJsDiagnostics.ts",

src/server/tsconfig.library.json

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
"../services/codefixes/fixForgottenThisPropertyAccess.ts",
109109
"../services/codefixes/fixUnusedIdentifier.ts",
110110
"../services/codefixes/fixUnreachableCode.ts",
111+
"../services/codefixes/fixUnusedLabel.ts",
111112
"../services/codefixes/fixJSDocTypes.ts",
112113
"../services/codefixes/fixAwaitInSyncFunction.ts",
113114
"../services/codefixes/disableJsDiagnostics.ts",
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/* @internal */
2+
namespace ts.codefix {
3+
const fixId = "fixUnusedLabel";
4+
const errorCodes = [Diagnostics.Unused_label.code];
5+
registerCodeFix({
6+
errorCodes,
7+
getCodeActions(context) {
8+
const changes = textChanges.ChangeTracker.with(context, t => doChange(t, context.sourceFile, context.span.start));
9+
return [createCodeFixAction(fixId, changes, Diagnostics.Remove_unused_label, fixId, Diagnostics.Remove_all_unused_labels)];
10+
},
11+
fixIds: [fixId],
12+
getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, diag) => doChange(changes, diag.file, diag.start)),
13+
});
14+
15+
function doChange(changes: textChanges.ChangeTracker, sourceFile: SourceFile, start: number): void {
16+
const token = getTokenAtPosition(sourceFile, start, /*includeJsDocComment*/ false);
17+
const labeledStatement = cast(token.parent, isLabeledStatement);
18+
const pos = token.getStart(sourceFile);
19+
const statementPos = labeledStatement.statement.getStart(sourceFile);
20+
// If label is on a separate line, just delete the rest of that line, but not the indentation of the labeled statement.
21+
const end = positionsAreOnSameLine(pos, statementPos, sourceFile) ? statementPos
22+
: skipTrivia(sourceFile.text, findChildOfKind(labeledStatement, SyntaxKind.ColonToken, sourceFile)!.end, /*stopAfterLineBreak*/ true);
23+
changes.deleteRange(sourceFile, { pos, end });
24+
}
25+
}

src/services/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
"codefixes/fixForgottenThisPropertyAccess.ts",
100100
"codefixes/fixUnusedIdentifier.ts",
101101
"codefixes/fixUnreachableCode.ts",
102+
"codefixes/fixUnusedLabel.ts",
102103
"codefixes/fixJSDocTypes.ts",
103104
"codefixes/fixAwaitInSyncFunction.ts",
104105
"codefixes/disableJsDiagnostics.ts",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @noUnusedLocals: true
4+
5+
/////* a */label/* b */:/* c */while (1) {}
6+
7+
verify.codeFix({
8+
description: "Remove unused label",
9+
newFileContent:
10+
`/* a */while (1) {}`,
11+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @noUnusedLocals: true
4+
5+
////label1: while (1) {}
6+
////
7+
////function f() {
8+
////label2:
9+
//// while (1) {}
10+
////}
11+
12+
verify.codeFixAll({
13+
fixId: "fixUnusedLabel",
14+
fixAllDescription: "Remove all unused labels",
15+
newFileContent:
16+
`while (1) {}
17+
18+
function f() {
19+
while (1) {}
20+
}`,
21+
});

0 commit comments

Comments
 (0)