Skip to content

Commit dbd4ef4

Browse files
authored
Merge pull request #24192 from Kingwl/quick-fix-for-import-type
add quick fix for import type missing typeof
2 parents 2722d2e + 5d23305 commit dbd4ef4

File tree

8 files changed

+69
-0
lines changed

8 files changed

+69
-0
lines changed

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4257,5 +4257,9 @@
42574257
"Remove all unreachable code": {
42584258
"category": "Message",
42594259
"code": 95051
4260+
},
4261+
"Add missing typeof": {
4262+
"category": "Message",
4263+
"code": 95052
42604264
}
42614265
}

src/harness/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
"../services/codefixes/moduleSpecifiers.ts",
117117
"../services/codefixes/requireInTs.ts",
118118
"../services/codefixes/useDefaultImport.ts",
119+
"../services/codefixes/fixAddModuleReferTypeMissingTypeof.ts",
119120
"../services/refactors/extractSymbol.ts",
120121
"../services/refactors/generateGetAccessorAndSetAccessor.ts",
121122
"../services/refactors/moveToNewFile.ts",

src/server/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
"../services/codefixes/moduleSpecifiers.ts",
113113
"../services/codefixes/requireInTs.ts",
114114
"../services/codefixes/useDefaultImport.ts",
115+
"../services/codefixes/fixAddModuleReferTypeMissingTypeof.ts",
115116
"../services/refactors/extractSymbol.ts",
116117
"../services/refactors/generateGetAccessorAndSetAccessor.ts",
117118
"../services/refactors/moveToNewFile.ts",

src/server/tsconfig.library.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
"../services/codefixes/moduleSpecifiers.ts",
119119
"../services/codefixes/requireInTs.ts",
120120
"../services/codefixes/useDefaultImport.ts",
121+
"../services/codefixes/fixAddModuleReferTypeMissingTypeof.ts",
121122
"../services/refactors/extractSymbol.ts",
122123
"../services/refactors/generateGetAccessorAndSetAccessor.ts",
123124
"../services/refactors/moveToNewFile.ts",
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
}

src/services/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
"codefixes/moduleSpecifiers.ts",
110110
"codefixes/requireInTs.ts",
111111
"codefixes/useDefaultImport.ts",
112+
"codefixes/fixAddModuleReferTypeMissingTypeof.ts",
112113
"refactors/extractSymbol.ts",
113114
"refactors/generateGetAccessorAndSetAccessor.ts",
114115
"refactors/moveToNewFile.ts",
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// declare module "foo" {
4+
//// const a = "foo"
5+
//// export = a
6+
//// }
7+
//// const x: import("foo") = import("foo");
8+
9+
verify.codeFix({
10+
description: "Add missing typeof",
11+
newFileContent: `declare module "foo" {
12+
const a = "foo"
13+
export = a
14+
}
15+
const x: typeof import("foo") = import("foo");`
16+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @Filename: a.ts
4+
//// export = 1;
5+
6+
// @Filename: b.ts
7+
//// const a: import("./a") = import("./a")
8+
9+
goTo.file("b.ts")
10+
verify.codeFix({
11+
description: "Add missing typeof",
12+
newFileContent: `const a: typeof import("./a") = import("./a")`
13+
});

0 commit comments

Comments
 (0)