From 772bbd82e2932434edc150a718d95ae15240b99d Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Mon, 4 Apr 2022 15:11:05 +0300 Subject: [PATCH] fix(48544): allow to convert default exports to names for import type nodes --- src/services/findAllReferences.ts | 7 ++++++- src/services/refactors/convertExport.ts | 4 ++++ .../refactorConvertExport_defaultToNamed3.ts | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/refactorConvertExport_defaultToNamed3.ts diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index d9a74d10d07fd..bcd372f70d36d 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1193,10 +1193,15 @@ namespace ts.FindAllReferences { cb: (ref: Identifier) => void, ): void { const importTracker = createImportTracker(sourceFiles, new Set(sourceFiles.map(f => f.fileName)), checker, cancellationToken); - const { importSearches, indirectUsers } = importTracker(exportSymbol, { exportKind: isDefaultExport ? ExportKind.Default : ExportKind.Named, exportingModuleSymbol }, /*isForRename*/ false); + const { importSearches, indirectUsers, singleReferences } = importTracker(exportSymbol, { exportKind: isDefaultExport ? ExportKind.Default : ExportKind.Named, exportingModuleSymbol }, /*isForRename*/ false); for (const [importLocation] of importSearches) { cb(importLocation); } + for (const singleReference of singleReferences) { + if (isIdentifier(singleReference) && isImportTypeNode(singleReference.parent)) { + cb(singleReference); + } + } for (const indirectUser of indirectUsers) { for (const node of getPossibleSymbolReferenceNodes(indirectUser, isDefaultExport ? "default" : exportName)) { // Import specifiers should be handled by importSearches diff --git a/src/services/refactors/convertExport.ts b/src/services/refactors/convertExport.ts index 3d3a9de095b80..738731a5c8aca 100644 --- a/src/services/refactors/convertExport.ts +++ b/src/services/refactors/convertExport.ts @@ -212,6 +212,10 @@ namespace ts.refactor { } break; } + case SyntaxKind.ImportType: + const importTypeNode = parent as ImportTypeNode; + changes.replaceNode(importingSourceFile, parent, factory.createImportTypeNode(importTypeNode.argument, factory.createIdentifier(exportName), importTypeNode.typeArguments, importTypeNode.isTypeOf)); + break; default: Debug.failBadSyntaxKind(parent); } diff --git a/tests/cases/fourslash/refactorConvertExport_defaultToNamed3.ts b/tests/cases/fourslash/refactorConvertExport_defaultToNamed3.ts new file mode 100644 index 0000000000000..dfe5ccca3330a --- /dev/null +++ b/tests/cases/fourslash/refactorConvertExport_defaultToNamed3.ts @@ -0,0 +1,18 @@ +/// + +// @Filename: /a.ts +/////*a*/export default class A {}/*b*/ + +// @Filename: /b.ts +////export type A = typeof import("./a").default; + +goTo.select("a", "b"); +edit.applyRefactor({ + refactorName: "Convert export", + actionName: "Convert default export to named export", + actionDescription: "Convert default export to named export", + newContent: { + "/a.ts": "export class A {}", + "/b.ts": "export type A = typeof import(\"./a\").A;" + }, +});