Merge pull request #24192 from Kingwl/quick-fix-for-import-type

add quick fix for import type missing typeof
This commit is contained in:
Mohamed Hegazy
2018-05-17 09:04:19 -07:00
committed by GitHub
8 changed files with 69 additions and 0 deletions

View File

@@ -4257,5 +4257,9 @@
"Remove all unreachable code": {
"category": "Message",
"code": 95051
},
"Add missing typeof": {
"category": "Message",
"code": 95052
}
}

View File

@@ -116,6 +116,7 @@
"../services/codefixes/moduleSpecifiers.ts",
"../services/codefixes/requireInTs.ts",
"../services/codefixes/useDefaultImport.ts",
"../services/codefixes/fixAddModuleReferTypeMissingTypeof.ts",
"../services/refactors/extractSymbol.ts",
"../services/refactors/generateGetAccessorAndSetAccessor.ts",
"../services/refactors/moveToNewFile.ts",

View File

@@ -112,6 +112,7 @@
"../services/codefixes/moduleSpecifiers.ts",
"../services/codefixes/requireInTs.ts",
"../services/codefixes/useDefaultImport.ts",
"../services/codefixes/fixAddModuleReferTypeMissingTypeof.ts",
"../services/refactors/extractSymbol.ts",
"../services/refactors/generateGetAccessorAndSetAccessor.ts",
"../services/refactors/moveToNewFile.ts",

View File

@@ -118,6 +118,7 @@
"../services/codefixes/moduleSpecifiers.ts",
"../services/codefixes/requireInTs.ts",
"../services/codefixes/useDefaultImport.ts",
"../services/codefixes/fixAddModuleReferTypeMissingTypeof.ts",
"../services/refactors/extractSymbol.ts",
"../services/refactors/generateGetAccessorAndSetAccessor.ts",
"../services/refactors/moveToNewFile.ts",

View File

@@ -0,0 +1,32 @@
/* @internal */
namespace ts.codefix {
const fixIdAddMissingTypeof = "fixAddModuleReferTypeMissingTypeof";
const fixId = fixIdAddMissingTypeof;
const errorCodes = [Diagnostics.Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here.code];
registerCodeFix({
errorCodes,
getCodeActions: context => {
const { sourceFile, span } = context;
const typeContainer = getImportTypeNode(sourceFile, span.start);
if (!typeContainer) return undefined;
const changes = textChanges.ChangeTracker.with(context, t => doChange(t, sourceFile, typeContainer));
return [createCodeFixAction(fixId, changes, Diagnostics.Add_missing_typeof, fixId, Diagnostics.Add_missing_typeof)];
},
fixIds: [fixId],
getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, diag) =>
doChange(changes, context.sourceFile, getImportTypeNode(diag.file, diag.start!))),
});
function getImportTypeNode(sourceFile: SourceFile, pos: number): ImportTypeNode | undefined {
const token = getTokenAtPosition(sourceFile, pos, /*includeJsDocComment*/ false);
Debug.assert(token.kind === SyntaxKind.ImportKeyword);
Debug.assert(token.parent.kind === SyntaxKind.ImportType);
return <ImportTypeNode>token.parent;
}
function doChange(changes: textChanges.ChangeTracker, sourceFile: SourceFile, typeContainer: ImportTypeNode) {
const newTypeNode = updateImportTypeNode(typeContainer, typeContainer.argument, typeContainer.qualifier, typeContainer.typeArguments, /* isTypeOf */ true);
changes.replaceNode(sourceFile, typeContainer, newTypeNode);
}
}

View File

@@ -109,6 +109,7 @@
"codefixes/moduleSpecifiers.ts",
"codefixes/requireInTs.ts",
"codefixes/useDefaultImport.ts",
"codefixes/fixAddModuleReferTypeMissingTypeof.ts",
"refactors/extractSymbol.ts",
"refactors/generateGetAccessorAndSetAccessor.ts",
"refactors/moveToNewFile.ts",

View File

@@ -0,0 +1,16 @@
/// <reference path='fourslash.ts' />
//// declare module "foo" {
//// const a = "foo"
//// export = a
//// }
//// const x: import("foo") = import("foo");
verify.codeFix({
description: "Add missing typeof",
newFileContent: `declare module "foo" {
const a = "foo"
export = a
}
const x: typeof import("foo") = import("foo");`
});

View File

@@ -0,0 +1,13 @@
/// <reference path='fourslash.ts' />
// @Filename: a.ts
//// export = 1;
// @Filename: b.ts
//// const a: import("./a") = import("./a")
goTo.file("b.ts")
verify.codeFix({
description: "Add missing typeof",
newFileContent: `const a: typeof import("./a") = import("./a")`
});