Move: Fix handler selection when moving Java class with Kotlin file/class

This commit is contained in:
Alexey Sedunov
2015-06-18 20:17:08 +03:00
parent cd550ed5ba
commit dd3ba8675d
@@ -17,10 +17,7 @@
package org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories package org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiDirectory import com.intellij.psi.*
import com.intellij.psi.PsiDirectoryContainer
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.refactoring.move.MoveCallback import com.intellij.refactoring.move.MoveCallback
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesHandler import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesHandler
import org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories import org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories
@@ -28,25 +25,29 @@ import org.jetbrains.kotlin.psi.JetClassOrObject
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
public class KotlinMoveFilesOrDirectoriesHandler : MoveFilesOrDirectoriesHandler() { public class KotlinMoveFilesOrDirectoriesHandler : MoveFilesOrDirectoriesHandler() {
override fun canMove(elements: Array<PsiElement>, targetContainer: PsiElement?): Boolean { private fun adjustElements(elements: Array<out PsiElement>): Array<PsiElement>? {
val adjustedElements = elements.map { return elements.map {
when { when {
it is PsiFile, it is PsiDirectory -> it it is PsiFile, it is PsiDirectory -> it
it is PsiClass && it.getContainingClass() == null -> it.getContainingFile()
it is JetClassOrObject && it.getParent() is JetFile -> it.getParent() it is JetClassOrObject && it.getParent() is JetFile -> it.getParent()
else -> return false else -> return null
} }
} }.toTypedArray()
return super.canMove(adjustedElements.toTypedArray(), targetContainer)
} }
override fun adjustForMove(project: Project, sourceElements: Array<out PsiElement>, targetElement: PsiElement?): Array<PsiElement> { override fun canMove(elements: Array<PsiElement>, targetContainer: PsiElement?): Boolean {
return sourceElements.map { if (it is JetClassOrObject) it.getContainingFile() else it }.toTypedArray() return super.canMove(adjustElements(elements), targetContainer)
}
override fun adjustForMove(project: Project, sourceElements: Array<out PsiElement>, targetElement: PsiElement?): Array<PsiElement>? {
return adjustElements(sourceElements)
} }
override fun doMove(project: Project, elements: Array<out PsiElement>, targetContainer: PsiElement?, callback: MoveCallback?) { override fun doMove(project: Project, elements: Array<out PsiElement>, targetContainer: PsiElement?, callback: MoveCallback?) {
if (!(targetContainer == null || targetContainer is PsiDirectory || targetContainer is PsiDirectoryContainer)) return if (!(targetContainer == null || targetContainer is PsiDirectory || targetContainer is PsiDirectoryContainer)) return
moveFilesOrDirectories(project, adjustForMove(project, elements, targetContainer), targetContainer) { moveFilesOrDirectories(project, adjustForMove(project, elements, targetContainer) ?: return, targetContainer) {
callback?.refactoringCompleted() callback?.refactoringCompleted()
} }
} }