diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt index 19f46d3748e..19ddbe651c9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinFileHandler.kt @@ -40,12 +40,14 @@ import java.util.* class MoveKotlinFileHandler : MoveFileHandler() { internal class InternalUsagesWrapper(file: KtFile, val usages: List) : UsageInfo(file) + internal class FileInfo(file: KtFile) : UsageInfo(file) + // This is special 'PsiElement' whose purpose is to wrap MoveKotlinTopLevelDeclarationsProcessor - // so that it can be kept in the transition map + // so that it can be kept in the usage info list private class MoveContext( - psiManager: PsiManager, + val file: PsiFile, val declarationMoveProcessor: MoveKotlinDeclarationsProcessor - ): LightElement(psiManager, KotlinLanguage.INSTANCE) { + ): LightElement(file.manager, KotlinLanguage.INSTANCE) { override fun toString() = "" } @@ -117,7 +119,7 @@ class MoveKotlinFileHandler : MoveFileHandler() { ): List { if (psiFile !is KtFile) return emptyList() - val usages = ArrayList() + val usages = arrayListOf(FileInfo(psiFile)) initMoveProcessor(psiFile, newParent)?.let { usages += it.findUsages() usages += it.getConflictsAsUsages() @@ -127,7 +129,7 @@ class MoveKotlinFileHandler : MoveFileHandler() { override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: MutableMap) { val moveProcessor = initMoveProcessor(file, moveDestination) ?: return - val moveContext = MoveContext(file.manager, moveProcessor) + val moveContext = MoveContext(file, moveProcessor) oldToNewMap[moveContext] = moveContext } @@ -139,7 +141,8 @@ class MoveKotlinFileHandler : MoveFileHandler() { } override fun retargetUsages(usageInfos: List?, oldToNewMap: Map) { - val moveContext = oldToNewMap.keys.firstIsInstanceOrNull() ?: return + val currentFile = (usageInfos?.firstOrNull() as? FileInfo)?.element + val moveContext = oldToNewMap.keys.firstOrNull { it is MoveContext && it.file == currentFile} as? MoveContext ?: return retargetUsages(usageInfos, moveContext.declarationMoveProcessor) } diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/source/dummy.txt b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/source/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/target/bar.kt b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/target/bar.kt new file mode 100644 index 00000000000..1af8cc365f4 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/target/bar.kt @@ -0,0 +1,5 @@ +package target + +interface NamedFaceO + +class NamedClassO : NamedFaceO \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/target/dummy.txt b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/target/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/target/foo.kt b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/target/foo.kt new file mode 100644 index 00000000000..7ac172ef086 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/after/target/foo.kt @@ -0,0 +1,5 @@ +package target + +interface NamedFaceN + +class NamedClassN : NamedFaceN \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/source/bar.kt b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/source/bar.kt new file mode 100644 index 00000000000..fad3b7ac75f --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/source/bar.kt @@ -0,0 +1,5 @@ +package source + +interface NamedFaceO + +class NamedClassO : NamedFaceO \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/source/dummy.txt b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/source/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/source/foo.kt b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/source/foo.kt new file mode 100644 index 00000000000..42174271978 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/source/foo.kt @@ -0,0 +1,5 @@ +package source + +interface NamedFaceN + +class NamedClassN : NamedFaceN \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/target/dummy.txt b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/before/target/dummy.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test new file mode 100644 index 00000000000..a5e8bac6110 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test @@ -0,0 +1,5 @@ +{ + "filesToMove": ["source/foo.kt", "source/bar.kt"], + "type": "MOVE_FILES_WITH_DECLARATIONS", + "targetDirectory": "target" +} \ No newline at end of file diff --git a/idea/testData/refactoring/moveMultiModule/moveFileWithDeclarationsToUnrelatedModuleConflict/moveFileWithDeclarationsToUnrelatedModuleConflict.test b/idea/testData/refactoring/moveMultiModule/moveFileWithDeclarationsToUnrelatedModuleConflict/moveFileWithDeclarationsToUnrelatedModuleConflict.test index 44c36a5974c..d8a8f6b5a82 100644 --- a/idea/testData/refactoring/moveMultiModule/moveFileWithDeclarationsToUnrelatedModuleConflict/moveFileWithDeclarationsToUnrelatedModuleConflict.test +++ b/idea/testData/refactoring/moveMultiModule/moveFileWithDeclarationsToUnrelatedModuleConflict/moveFileWithDeclarationsToUnrelatedModuleConflict.test @@ -1,5 +1,5 @@ { - "mainFile": "A/src/a1/internalTarget.kt", + "filesToMove": ["A/src/a1/internalTarget.kt"], "type": "MOVE_FILES_WITH_DECLARATIONS", "targetDirectory": "B/src/b", "withRuntime": "true" diff --git a/idea/testData/refactoring/moveMultiModule/moveToModuleWithoutLibConflict/moveToModuleWithoutLibConflict.test b/idea/testData/refactoring/moveMultiModule/moveToModuleWithoutLibConflict/moveToModuleWithoutLibConflict.test index e41c67f0472..bd14c0912ed 100644 --- a/idea/testData/refactoring/moveMultiModule/moveToModuleWithoutLibConflict/moveToModuleWithoutLibConflict.test +++ b/idea/testData/refactoring/moveMultiModule/moveToModuleWithoutLibConflict/moveToModuleWithoutLibConflict.test @@ -1,5 +1,5 @@ { - "mainFile": "A/src/a/test.kt", + "filesToMove": ["A/src/a/test.kt"], "type": "MOVE_FILES_WITH_DECLARATIONS", "targetDirectory": "B/src/b", "withRuntime": "true", diff --git a/idea/testData/refactoring/moveMultiModule/visibilityConflictInImport/visibilityConflictInImport.test b/idea/testData/refactoring/moveMultiModule/visibilityConflictInImport/visibilityConflictInImport.test index 44c36a5974c..d8a8f6b5a82 100644 --- a/idea/testData/refactoring/moveMultiModule/visibilityConflictInImport/visibilityConflictInImport.test +++ b/idea/testData/refactoring/moveMultiModule/visibilityConflictInImport/visibilityConflictInImport.test @@ -1,5 +1,5 @@ { - "mainFile": "A/src/a1/internalTarget.kt", + "filesToMove": ["A/src/a1/internalTarget.kt"], "type": "MOVE_FILES_WITH_DECLARATIONS", "targetDirectory": "B/src/b", "withRuntime": "true" diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt index d542b311b11..5ec00b0a427 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt @@ -47,6 +47,7 @@ import org.jetbrains.kotlin.idea.refactoring.move.changePackage.KotlinChangePack import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.* import org.jetbrains.kotlin.idea.refactoring.rename.loadTestConfiguration import org.jetbrains.kotlin.idea.refactoring.toPsiDirectory +import org.jetbrains.kotlin.idea.refactoring.toPsiFile import org.jetbrains.kotlin.idea.search.allScope import org.jetbrains.kotlin.idea.search.projectScope import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex @@ -111,7 +112,7 @@ fun runMoveRefactoring(path: String, config: JsonObject, rootDir: VirtualFile, p val action = MoveAction.valueOf(config.getString("type")) val testDir = path.substring(0, path.lastIndexOf("/")) - val mainFilePath = config.getNullableString("mainFile")!! + val mainFilePath = config.getNullableString("mainFile") ?: config.getAsJsonArray("filesToMove").first().asString val conflictFile = File(testDir + "/conflicts.txt") @@ -271,14 +272,16 @@ enum class MoveAction { MOVE_FILES_WITH_DECLARATIONS { override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { val project = mainFile.project - + val psiFilesToMove = config.getAsJsonArray("filesToMove").map { + rootDir.findFileByRelativePath(it.asString)!!.toPsiFile(project) as KtFile + } val targetDirPath = config.getString("targetDirectory") val targetDir = rootDir.findFileByRelativePath(targetDirPath)!!.toPsiDirectory(project)!! MoveFilesWithDeclarationsProcessor( project, - listOf(mainFile as KtFile), + psiFilesToMove, targetDir, - mainFile.name, + psiFilesToMove.singleOrNull()?.name, searchInComments = true, searchInNonJavaFiles = true, moveCallback = null diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java index 2f2ae1d599b..87650e226e8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java @@ -288,6 +288,12 @@ public class MoveTestGenerated extends AbstractMoveTest { doTest(fileName); } + @TestMetadata("kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test") + public void testKotlin_moveFile_moveMultipleFIles_MoveMultipleFiles() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test"); + doTest(fileName); + } + @TestMetadata("kotlin/moveFile/packageWithQuotation/moveFileToPackageWithQuotation.test") public void testKotlin_moveFile_packageWithQuotation_MoveFileToPackageWithQuotation() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveFile/packageWithQuotation/moveFileToPackageWithQuotation.test");