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