|
| 1 | +/* @internal */ |
| 2 | +namespace ts.codefix { |
| 3 | + const fixIdAddMissingTypeof = "fixAddModuleReferTypeMissingTypeof"; |
| 4 | + const fixId = fixIdAddMissingTypeof; |
| 5 | + const errorCodes = [Diagnostics.Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here.code]; |
| 6 | + registerCodeFix({ |
| 7 | + errorCodes, |
| 8 | + getCodeActions: context => { |
| 9 | + const { sourceFile, span } = context; |
| 10 | + const typeContainer = getImportTypeNode(sourceFile, span.start); |
| 11 | + if (!typeContainer) return undefined; |
| 12 | + |
| 13 | + const changes = textChanges.ChangeTracker.with(context, t => doChange(t, sourceFile, typeContainer)); |
| 14 | + return [createCodeFixAction(fixId, changes, Diagnostics.Add_missing_typeof, fixId, Diagnostics.Add_missing_typeof)]; |
| 15 | + }, |
| 16 | + fixIds: [fixId], |
| 17 | + getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, diag) => |
| 18 | + doChange(changes, context.sourceFile, getImportTypeNode(diag.file, diag.start!))), |
| 19 | + }); |
| 20 | + |
| 21 | + function getImportTypeNode(sourceFile: SourceFile, pos: number): ImportTypeNode | undefined { |
| 22 | + const token = getTokenAtPosition(sourceFile, pos, /*includeJsDocComment*/ false); |
| 23 | + Debug.assert(token.kind === SyntaxKind.ImportKeyword); |
| 24 | + Debug.assert(token.parent.kind === SyntaxKind.ImportType); |
| 25 | + return <ImportTypeNode>token.parent; |
| 26 | + } |
| 27 | + |
| 28 | + function doChange(changes: textChanges.ChangeTracker, sourceFile: SourceFile, typeContainer: ImportTypeNode) { |
| 29 | + const newTypeNode = updateImportTypeNode(typeContainer, typeContainer.argument, typeContainer.qualifier, typeContainer.typeArguments, /* isTypeOf */ true); |
| 30 | + changes.replaceNode(sourceFile, typeContainer, newTypeNode); |
| 31 | + } |
| 32 | +} |
0 commit comments