diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/KotlinChangePackageRefactoring.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/KotlinChangePackageRefactoring.kt index c232f7da5ec..6c6fee53952 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/KotlinChangePackageRefactoring.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/changePackage/KotlinChangePackageRefactoring.kt @@ -42,7 +42,6 @@ public class KotlinChangePackageRefactoring(val file: JetFile) { val declarationProcessor = MoveKotlinTopLevelDeclarationsProcessor( project, MoveKotlinTopLevelDeclarationsOptions( - sourceFile = file, elementsToMove = file.getDeclarations().filterIsInstance(), moveTarget = object: KotlinMoveTarget { override val packageWrapper = PackageWrapper(file.getManager(), newFqName.asString()) 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 e5a2dbb3880..46aff1b4abf 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 @@ -61,7 +61,6 @@ public class MoveKotlinFileHandler : MoveFileHandler() { val declarationMoveProcessor = MoveKotlinTopLevelDeclarationsProcessor( project, MoveKotlinTopLevelDeclarationsOptions( - sourceFile = psiFile, elementsToMove = psiFile.getDeclarations().filterIsInstance(), moveTarget = DeferredJetFileKotlinMoveTarget(project, packageNameInfo.newPackageName) { MoveFilesOrDirectoriesUtil.doMoveFile(psiFile, newParent) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt index 4f838b3de5a..908a2f6b329 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveTopLevelDeclarations import com.intellij.openapi.project.Project import com.intellij.openapi.util.Ref import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiModifier -import com.intellij.psi.PsiModifierListOwner -import com.intellij.psi.PsiReference +import com.intellij.psi.* import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.refactoring.BaseRefactoringProcessor import com.intellij.refactoring.move.MoveCallback @@ -80,13 +77,12 @@ interface Mover: (originalElement: JetNamedDeclaration, targetFile: JetFile) -> } public class MoveKotlinTopLevelDeclarationsOptions( - val sourceFile: JetFile, val elementsToMove: Collection, val moveTarget: KotlinMoveTarget, val searchInCommentsAndStrings: Boolean = true, val searchInNonCode: Boolean = true, val updateInternalReferences: Boolean = true, - val deleteSourceFile: Boolean = false, + val deleteSourceFiles: Boolean = false, val moveCallback: MoveCallback? = null ) @@ -100,7 +96,9 @@ public class MoveKotlinTopLevelDeclarationsProcessor( private var nonCodeUsages: Array? = null private val elementsToMove = options.elementsToMove.filter { e -> e.getContainingFile() != options.moveTarget.getTargetPsiIfExists(e) } - private val kotlinToLightElements = elementsToMove.keysToMap { it.toLightElements() } + private val kotlinToLightElementsBySourceFile = elementsToMove + .groupBy { it.getContainingJetFile() } + .mapValues { it.value.keysToMap { it.toLightElements() } } private val conflicts = MultiMap() override fun createUsageViewDescriptor(usages: Array): UsageViewDescriptor { @@ -113,8 +111,8 @@ public class MoveKotlinTopLevelDeclarationsProcessor( public override fun findUsages(): Array { val newPackageName = options.moveTarget.packageWrapper?.getQualifiedName() ?: "" - fun collectUsages(): List { - return kotlinToLightElements.values().flatMap { it }.flatMap { lightElement -> + fun collectUsages(kotlinToLightElements: Map>, result: MutableList) { + kotlinToLightElements.values().flatMap { it }.flatMapTo(result) { lightElement -> val newFqName = StringUtil.getQualifiedName(newPackageName, lightElement.getName()) val foundReferences = HashSet() @@ -219,12 +217,17 @@ public class MoveKotlinTopLevelDeclarationsProcessor( } } - // No need to find and process usages if package is not changed - if (options.sourceFile.getPackageFqName().asString() == newPackageName) return UsageInfo.EMPTY_ARRAY + val usages = ArrayList() + for ((sourceFile, kotlinToLightElements) in kotlinToLightElementsBySourceFile) { + // No need to find and process usages if package is not changed + if (sourceFile.getPackageFqName().asString() == newPackageName) return UsageInfo.EMPTY_ARRAY + + collectUsages(kotlinToLightElements, usages) + collectConflictsInUsages(usages) + collectConflictsInDeclarations() + } + - val usages = collectUsages() - collectConflictsInUsages(usages) - collectConflictsInDeclarations() return UsageViewUtil.removeDuplicatedUsages(usages.toTypedArray()) } @@ -264,29 +267,29 @@ public class MoveKotlinTopLevelDeclarationsProcessor( val usageList = usages.toArrayList() val oldToNewElementsMapping = HashMap() - for ((oldDeclaration, oldLightElements) in kotlinToLightElements) { - val oldFile = oldDeclaration.getContainingJetFile() - - val newDeclaration = moveDeclaration(oldDeclaration, options.moveTarget, usageList) - if (newDeclaration == null) { - for (oldElement in oldLightElements) { - oldToNewElementsMapping[oldElement] = oldElement + for ((sourceFile, kotlinToLightElements) in kotlinToLightElementsBySourceFile) { + for ((oldDeclaration, oldLightElements) in kotlinToLightElements) { + val newDeclaration = moveDeclaration(oldDeclaration, options.moveTarget, usageList) + if (newDeclaration == null) { + for (oldElement in oldLightElements) { + oldToNewElementsMapping[oldElement] = oldElement + } + continue + } + + oldToNewElementsMapping[sourceFile] = newDeclaration.getContainingJetFile() + + getTransaction()!!.getElementListener(oldDeclaration).elementMoved(newDeclaration) + for ((oldElement, newElement) in oldLightElements.asSequence() zip newDeclaration.toLightElements().asSequence()) { + oldToNewElementsMapping[oldElement] = newElement } - continue } - oldToNewElementsMapping[oldFile] = newDeclaration.getContainingJetFile() - - getTransaction()!!.getElementListener(oldDeclaration).elementMoved(newDeclaration) - for ((oldElement, newElement) in oldLightElements.asSequence() zip newDeclaration.toLightElements().asSequence()) { - oldToNewElementsMapping[oldElement] = newElement + if (options.deleteSourceFiles) { + sourceFile.delete() } } - if (options.deleteSourceFile) { - options.sourceFile.delete() - } - nonCodeUsages = postProcessMoveUsages(usageList, oldToNewElementsMapping).toTypedArray() } catch (e: IncorrectOperationException) { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java index fca3d54ca2e..9cdeb825807 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java @@ -624,7 +624,7 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { } MoveKotlinTopLevelDeclarationsOptions options = new MoveKotlinTopLevelDeclarationsOptions( - sourceFile, elementsToMove, target, isSearchInComments(), isSearchInNonJavaFiles(), true, deleteSourceFile, moveCallback + elementsToMove, target, isSearchInComments(), isSearchInNonJavaFiles(), true, deleteSourceFile, moveCallback ); invokeRefactoring(new MoveKotlinTopLevelDeclarationsProcessor(myProject, options, Mover.Default.INSTANCE$)); } diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractJetMoveTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractJetMoveTest.kt index 1b90f948e26..caf5c541475 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractJetMoveTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractJetMoveTest.kt @@ -255,7 +255,7 @@ enum class MoveAction { JetFileKotlinMoveTarget(PsiManager.getInstance(project).findFile(rootDir.findFileByRelativePath(filePath)!!) as JetFile) } - val options = MoveKotlinTopLevelDeclarationsOptions(mainFile as JetFile, listOf(elementToMove), moveTarget) + val options = MoveKotlinTopLevelDeclarationsOptions(listOf(elementToMove), moveTarget) MoveKotlinTopLevelDeclarationsProcessor(mainFile.getProject(), options).run() } },