• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* @internal */
2namespace 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);
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}
26