From 2d2cc3b9e9d7aa878b5f7b1d3975c80806cc9c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Mon, 4 Nov 2024 14:27:51 +0100 Subject: [PATCH] Allow imports with the same names as global types to be moved by refactoring --- src/services/refactors/moveToFile.ts | 4 ++-- .../moveToNewFile_importNameLikeGlobal1.ts | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fourslash/moveToNewFile_importNameLikeGlobal1.ts diff --git a/src/services/refactors/moveToFile.ts b/src/services/refactors/moveToFile.ts index 241e9adf2ad2f..3fafff54cd621 100644 --- a/src/services/refactors/moveToFile.ts +++ b/src/services/refactors/moveToFile.ts @@ -885,7 +885,7 @@ export function getUsageInfo(oldFile: SourceFile, toMove: readonly Statement[], const unusedImportsFromOldFile = new Set(); for (const statement of toMove) { forEachReference(statement, checker, enclosingRange, (symbol, isValidTypeOnlyUseSite) => { - if (!symbol.declarations || isGlobalType(checker, symbol)) { + if (!symbol.declarations) { return; } if (existingTargetLocals.has(skipAlias(symbol, checker))) { @@ -900,7 +900,7 @@ export function getUsageInfo(oldFile: SourceFile, toMove: readonly Statement[], tryCast(decl, (d): d is codefix.ImportOrRequireAliasDeclaration => isImportSpecifier(d) || isImportClause(d) || isNamespaceImport(d) || isImportEqualsDeclaration(d) || isBindingElement(d) || isVariableDeclaration(d)), ]); } - else if (isTopLevelDeclaration(decl) && sourceFileOfTopLevelDeclaration(decl) === oldFile && !movedSymbols.has(symbol)) { + else if (!isGlobalType(checker, symbol) && isTopLevelDeclaration(decl) && sourceFileOfTopLevelDeclaration(decl) === oldFile && !movedSymbols.has(symbol)) { targetFileImportsFromOldFile.set(symbol, isValidTypeOnlyUseSite); } } diff --git a/tests/cases/fourslash/moveToNewFile_importNameLikeGlobal1.ts b/tests/cases/fourslash/moveToNewFile_importNameLikeGlobal1.ts new file mode 100644 index 0000000000000..018ca7dcfd0f4 --- /dev/null +++ b/tests/cases/fourslash/moveToNewFile_importNameLikeGlobal1.ts @@ -0,0 +1,24 @@ +/// + +// @lib: dom + +// @Filename: /a.ts +//// export default class Event {} + +// @Filename: /b.ts +//// import Event from './a.js'; +//// [|export function test(test: Event): void {}|] + +verify.noErrors(); + +verify.moveToNewFile({ + newFileContents: { + "/b.ts": "", + + "/test.ts": +`import Event from './a'; + +export function test(test: Event): void { } +`, + }, +});