|
| 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 | +} |
0 commit comments