From 94bb9500087d99aeeeb3c24e8d9c628ac523cffd Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Thu, 28 Jul 2022 01:41:31 +0300 Subject: [PATCH] feat(49358): use filename based on exported name (#49875) --- src/services/refactors/moveToNewFile.ts | 6 +-- ...veToNewFile_fileNameBasedOnExportedName.ts | 39 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 tests/cases/fourslash/moveToNewFile_fileNameBasedOnExportedName.ts diff --git a/src/services/refactors/moveToNewFile.ts b/src/services/refactors/moveToNewFile.ts index da148267ec8..287178169e6 100644 --- a/src/services/refactors/moveToNewFile.ts +++ b/src/services/refactors/moveToNewFile.ts @@ -62,7 +62,7 @@ namespace ts.refactor { const currentDirectory = getDirectoryPath(oldFile.fileName); const extension = extensionFromPath(oldFile.fileName); - const newModuleName = makeUniqueModuleName(getNewModuleName(usage.movedSymbols), extension, currentDirectory, host); + const newModuleName = makeUniqueModuleName(getNewModuleName(usage.oldFileImportsFromNewFile, usage.movedSymbols), extension, currentDirectory, host); const newFileNameWithExtension = newModuleName + extension; // If previous file was global, this is easy. @@ -478,8 +478,8 @@ namespace ts.refactor { } } - function getNewModuleName(movedSymbols: ReadonlySymbolSet): string { - return movedSymbols.forEachEntry(symbolNameNoDefault) || "newFile"; + function getNewModuleName(importsFromNewFile: ReadonlySymbolSet, movedSymbols: ReadonlySymbolSet): string { + return importsFromNewFile.forEachEntry(symbolNameNoDefault) || movedSymbols.forEachEntry(symbolNameNoDefault) || "newFile"; } interface UsageInfo { diff --git a/tests/cases/fourslash/moveToNewFile_fileNameBasedOnExportedName.ts b/tests/cases/fourslash/moveToNewFile_fileNameBasedOnExportedName.ts new file mode 100644 index 00000000000..4d465662ebb --- /dev/null +++ b/tests/cases/fourslash/moveToNewFile_fileNameBasedOnExportedName.ts @@ -0,0 +1,39 @@ +/// + +// @Filename: /a.ts +////[|type Props = { +//// a: number; +////} +////class Foo { +//// readonly a: number; +//// constructor({ a }: Props) { +//// this.a = a; +//// } +////}|] +//// +////export default function f() { +//// return new Foo({ a: 1 }); +////} + +verify.moveToNewFile({ + newFileContents: { + "/a.ts": +`import { Foo } from "./Foo"; + +export default function f() { + return new Foo({ a: 1 }); +}`, + + "/Foo.ts": +`type Props = { + a: number; +}; +export class Foo { + readonly a: number; + constructor({ a }: Props) { + this.a = a; + } +} +`, + }, +});