Fix copy refactoring for multiply kotlin files

Fixed #KT-34971
This commit is contained in:
Igor Yakovlev
2019-11-19 20:52:31 +03:00
parent 7d944e2023
commit aba5ff0c1e
10 changed files with 59 additions and 6 deletions
@@ -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() }
@@ -0,0 +1,5 @@
package bar
class A {
val a: A = A()
}
@@ -0,0 +1,5 @@
package bar
class B {
val b: B = B()
}
@@ -0,0 +1,5 @@
package foo
class A {
val a: A = A()
}
@@ -0,0 +1,5 @@
package boo
class B {
val b: B = B()
}
@@ -0,0 +1,5 @@
package foo
class A {
val a: A = A()
}
@@ -0,0 +1,5 @@
package boo
class B {
val b: B = B()
}
@@ -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");