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 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
|
return elements
|
||||||
.map { it.containingFile ?: it as? PsiFileSystemItem ?: return null }
|
.map { it.containingFile ?: it as? PsiFileSystemItem ?: return null }
|
||||||
.toTypedArray()
|
.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 mapper = object : VirtualFileListener {
|
||||||
val filesCopied = mutableSetOf<VirtualFile>()
|
val filesCopied = mutableSetOf<VirtualFile>()
|
||||||
|
|
||||||
@@ -267,11 +270,11 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() {
|
|||||||
return mapper.filesCopied
|
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
|
if (filesToCopy.isEmpty()) return
|
||||||
|
|
||||||
val project = filesToCopy.first().project
|
val project = filesToCopy[0].project
|
||||||
val psiManager = PsiManager.getInstance(project)
|
val psiManager = PsiManager.getInstance(project)
|
||||||
|
|
||||||
project.executeCommand(commandName) {
|
project.executeCommand(commandName) {
|
||||||
@@ -298,7 +301,9 @@ class CopyKotlinDeclarationsHandler : CopyHandlerDelegateBase() {
|
|||||||
if (elements.isEmpty()) return
|
if (elements.isEmpty()) return
|
||||||
|
|
||||||
if (!canCopyDeclarations(elements)) {
|
if (!canCopyDeclarations(elements)) {
|
||||||
return doCopyFiles(elements, defaultTargetDirectory)
|
getSourceFiles(elements)?.let {
|
||||||
|
return doCopyFiles(it, defaultTargetDirectory)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val elementsToCopy = elements.mapNotNull { it.getCopyableElement() }
|
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.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
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.PackageWrapper
|
||||||
import com.intellij.refactoring.copy.CopyHandler
|
import com.intellij.refactoring.copy.CopyHandler
|
||||||
import com.intellij.refactoring.move.moveClassesOrPackages.MultipleRootsMoveDestination
|
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.copy.CopyKotlinDeclarationsHandler.Companion.newName
|
||||||
import org.jetbrains.kotlin.idea.refactoring.runRefactoringTest
|
import org.jetbrains.kotlin.idea.refactoring.runRefactoringTest
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.utils.ifEmpty
|
import org.jetbrains.kotlin.utils.ifEmpty
|
||||||
|
|
||||||
private enum class CopyAction : AbstractMultifileRefactoringTest.RefactoringAction {
|
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)!!
|
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");
|
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")
|
@TestMetadata("copyMultipleFilesToNewDirectory/copyMultipleFilesToNewDirectory.test")
|
||||||
public void testCopyMultipleFilesToNewDirectory_CopyMultipleFilesToNewDirectory() throws Exception {
|
public void testCopyMultipleFilesToNewDirectory_CopyMultipleFilesToNewDirectory() throws Exception {
|
||||||
runTest("idea/testData/refactoring/copy/copyMultipleFilesToNewDirectory/copyMultipleFilesToNewDirectory.test");
|
runTest("idea/testData/refactoring/copy/copyMultipleFilesToNewDirectory/copyMultipleFilesToNewDirectory.test");
|
||||||
|
|||||||
Reference in New Issue
Block a user