Fix copy refactoring for multiply kotlin files
Fixed #KT-34971
This commit is contained in:
+10
-5
@@ -68,7 +68,7 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() {
|
||||
|
||||
private val copyFilesHandler by lazy { CopyFilesOrDirectoriesHandler() }
|
||||
|
||||
private fun getSourceFiles(elements: Array<out PsiElement>): Array<PsiElement>? {
|
||||
private fun getSourceFiles(elements: Array<out PsiElement>): Array<PsiFileSystemItem>? {
|
||||
return elements
|
||||
.map { it.containingFile ?: it as? PsiFileSystemItem ?: return null }
|
||||
.toTypedArray()
|
||||
@@ -243,7 +243,10 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun trackedCopyFiles(sourceFiles: Array<out PsiElement>, initialTargetDirectory: PsiDirectory?): Set<VirtualFile> {
|
||||
private fun trackedCopyFiles(sourceFiles: Array<out PsiFileSystemItem>, initialTargetDirectory: PsiDirectory?): Set<VirtualFile> {
|
||||
|
||||
if (!copyFilesHandler.canCopy(sourceFiles)) return emptySet()
|
||||
|
||||
val mapper = object : VirtualFileListener {
|
||||
val filesCopied = mutableSetOf<VirtualFile>()
|
||||
|
||||
@@ -267,11 +270,11 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() {
|
||||
return mapper.filesCopied
|
||||
}
|
||||
|
||||
private fun doCopyFiles(filesToCopy: Array<out PsiElement>, initialTargetDirectory: PsiDirectory?) {
|
||||
private fun doCopyFiles(filesToCopy: Array<out PsiFileSystemItem>, initialTargetDirectory: PsiDirectory?) {
|
||||
|
||||
if (filesToCopy.isEmpty()) return
|
||||
|
||||
val project = filesToCopy.first().project
|
||||
val project = filesToCopy[0].project
|
||||
val psiManager = PsiManager.getInstance(project)
|
||||
|
||||
project.executeCommand(commandName) {
|
||||
@@ -298,7 +301,9 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() {
|
||||
if (elements.isEmpty()) return
|
||||
|
||||
if (!canCopyDeclarations(elements)) {
|
||||
return doCopyFiles(elements, defaultTargetDirectory)
|
||||
getSourceFiles(elements)?.let {
|
||||
return doCopyFiles(it, defaultTargetDirectory)
|
||||
}
|
||||
}
|
||||
|
||||
val elementsToCopy = elements.mapNotNull { it.getCopyableElement() }
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package bar
|
||||
|
||||
class A {
|
||||
val a: A = A()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package bar
|
||||
|
||||
class B {
|
||||
val b: B = B()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package foo
|
||||
|
||||
class A {
|
||||
val a: A = A()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package boo
|
||||
|
||||
class B {
|
||||
val b: B = B()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package foo
|
||||
|
||||
class A {
|
||||
val a: A = A()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package boo
|
||||
|
||||
class B {
|
||||
val b: B = B()
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"filesToMove": ["foo/test.kt", "foo/test2.kt"],
|
||||
"extractClassOrObject": true,
|
||||
"targetPackage": "bar",
|
||||
"type": "COPY_FILES"
|
||||
}
|
||||
@@ -10,6 +10,8 @@ import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import com.intellij.psi.util.PsiUtil
|
||||
import com.intellij.refactoring.PackageWrapper
|
||||
import com.intellij.refactoring.copy.CopyHandler
|
||||
import com.intellij.refactoring.move.moveClassesOrPackages.MultipleRootsMoveDestination
|
||||
@@ -21,6 +23,7 @@ import org.jetbrains.kotlin.idea.refactoring.AbstractMultifileRefactoringTest
|
||||
import org.jetbrains.kotlin.idea.refactoring.copy.CopyKotlinDeclarationsHandler.Companion.newName
|
||||
import org.jetbrains.kotlin.idea.refactoring.runRefactoringTest
|
||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.utils.ifEmpty
|
||||
|
||||
private enum class CopyAction : AbstractMultifileRefactoringTest.RefactoringAction {
|
||||
@@ -32,7 +35,11 @@ private enum class CopyAction : AbstractMultifileRefactoringTest.RefactoringActi
|
||||
if (virtualFile.isDirectory) virtualFile.toPsiDirectory(project)!! else virtualFile.toPsiFile(project)!!
|
||||
}
|
||||
|
||||
DEFAULT.runRefactoring(rootDir, mainFile, elementsToCopy, config)
|
||||
val typesToCopy = if (config.getNullableString("extractClassOrObject") == "true")
|
||||
elementsToCopy.flatMap { PsiTreeUtil.collectElementsOfType(it, KtClassOrObject::class.java) }
|
||||
else elementsToCopy
|
||||
|
||||
DEFAULT.runRefactoring(rootDir, mainFile, typesToCopy, config)
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -148,6 +148,11 @@ public class CopyTestGenerated extends AbstractCopyTest {
|
||||
runTest("idea/testData/refactoring/copy/copyMultipleFilesDifferentDirectoriesToNewDirectory/copyMultipleFilesDifferentDirectoriesToNewDirectory.test");
|
||||
}
|
||||
|
||||
@TestMetadata("copyMultipleFilesDirectoriesToNewDirectoryAsClassOrObject/copyMultipleFilesDifferentDirectoriesToNewDirectory.test")
|
||||
public void testCopyMultipleFilesDirectoriesToNewDirectoryAsClassOrObject_CopyMultipleFilesDifferentDirectoriesToNewDirectory() throws Exception {
|
||||
runTest("idea/testData/refactoring/copy/copyMultipleFilesDirectoriesToNewDirectoryAsClassOrObject/copyMultipleFilesDifferentDirectoriesToNewDirectory.test");
|
||||
}
|
||||
|
||||
@TestMetadata("copyMultipleFilesToNewDirectory/copyMultipleFilesToNewDirectory.test")
|
||||
public void testCopyMultipleFilesToNewDirectory_CopyMultipleFilesToNewDirectory() throws Exception {
|
||||
runTest("idea/testData/refactoring/copy/copyMultipleFilesToNewDirectory/copyMultipleFilesToNewDirectory.test");
|
||||
|
||||
Reference in New Issue
Block a user