Move: Use MoveFilesWithDeclarationProcessor for files & directories

This commit is contained in:
Alexey Sedunov
2017-04-07 16:30:05 +03:00
parent 22a56a81b9
commit 3007b11973
2 changed files with 19 additions and 37 deletions
@@ -21,6 +21,7 @@ import com.intellij.openapi.util.EmptyRunnable
import com.intellij.openapi.util.Ref import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiElement 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.MoveFilesOrDirectoriesProcessor import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesProcessor
import com.intellij.usageView.UsageInfo import com.intellij.usageView.UsageInfo
@@ -28,11 +29,10 @@ import com.intellij.usageView.UsageViewDescriptor
import com.intellij.usageView.UsageViewUtil import com.intellij.usageView.UsageViewUtil
import com.intellij.util.containers.MultiMap import com.intellij.util.containers.MultiMap
import com.intellij.util.text.UniqueNameGenerator import com.intellij.util.text.UniqueNameGenerator
import org.jetbrains.kotlin.psi.KtFile
class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor ( class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor (
project: Project, project: Project,
private val sourceFiles: List<KtFile>, private val elementsToMove: List<PsiElement>,
private val targetDirectory: PsiDirectory, private val targetDirectory: PsiDirectory,
private val targetFileName: String?, private val targetFileName: String?,
searchInComments: Boolean, searchInComments: Boolean,
@@ -40,7 +40,7 @@ class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor (
moveCallback: MoveCallback?, moveCallback: MoveCallback?,
prepareSuccessfulCallback: Runnable = EmptyRunnable.INSTANCE prepareSuccessfulCallback: Runnable = EmptyRunnable.INSTANCE
) : MoveFilesOrDirectoriesProcessor(project, ) : MoveFilesOrDirectoriesProcessor(project,
sourceFiles.toTypedArray<PsiElement>(), elementsToMove.toTypedArray<PsiElement>(),
targetDirectory, targetDirectory,
true, true,
searchInComments, searchInComments,
@@ -48,11 +48,11 @@ class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor (
moveCallback, moveCallback,
prepareSuccessfulCallback) { prepareSuccessfulCallback) {
override fun getCommandName(): String { override fun getCommandName(): String {
return if (targetFileName != null) "Move " + sourceFiles.single().name else "Move" return if (targetFileName != null) "Move " + (elementsToMove.single() as PsiFile).name else "Move"
} }
override fun createUsageViewDescriptor(usages: Array<out UsageInfo>): UsageViewDescriptor { override fun createUsageViewDescriptor(usages: Array<out UsageInfo>): UsageViewDescriptor {
return MoveFilesWithDeclarationsViewDescriptor(sourceFiles.toTypedArray<PsiElement>(), targetDirectory) return MoveFilesWithDeclarationsViewDescriptor(elementsToMove.toTypedArray<PsiElement>(), targetDirectory)
} }
override fun preprocessUsages(refUsages: Ref<Array<UsageInfo>>): Boolean { override fun preprocessUsages(refUsages: Ref<Array<UsageInfo>>): Boolean {
@@ -75,7 +75,7 @@ class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor (
private fun renameFileTemporarily() { private fun renameFileTemporarily() {
if (targetFileName == null || targetDirectory.findFile(targetFileName) == null) return if (targetFileName == null || targetDirectory.findFile(targetFileName) == null) return
val sourceFile = sourceFiles.single() val sourceFile = elementsToMove.single() as PsiFile
val temporaryName = UniqueNameGenerator.generateUniqueName("temp", "", ".kt") { val temporaryName = UniqueNameGenerator.generateUniqueName("temp", "", ".kt") {
sourceFile.containingDirectory!!.findFile(it) == null sourceFile.containingDirectory!!.findFile(it) == null
} }
@@ -93,7 +93,7 @@ class MoveFilesWithDeclarationsProcessor @JvmOverloads constructor (
} }
finally { finally {
if (needTemporaryRename) { if (needTemporaryRename) {
sourceFiles.single().name = targetFileName!! (elementsToMove.single() as PsiFile).name = targetFileName!!
} }
} }
} }
@@ -26,14 +26,12 @@ import com.intellij.refactoring.RefactoringBundle
import com.intellij.refactoring.copy.CopyFilesOrDirectoriesHandler import com.intellij.refactoring.copy.CopyFilesOrDirectoriesHandler
import com.intellij.refactoring.move.MoveCallback import com.intellij.refactoring.move.MoveCallback
import com.intellij.refactoring.move.MoveHandler import com.intellij.refactoring.move.MoveHandler
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesProcessor
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil
import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.refactoring.util.CommonRefactoringUtil
import com.intellij.util.IncorrectOperationException import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.idea.refactoring.isInJavaSourceRoot import org.jetbrains.kotlin.idea.refactoring.isInJavaSourceRoot
import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveFilesWithDeclarationsProcessor import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveFilesWithDeclarationsProcessor
import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui.KotlinAwareMoveFilesOrDirectoriesDialog import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui.KotlinAwareMoveFilesOrDirectoriesDialog
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.idea.util.application.executeCommand import org.jetbrains.kotlin.idea.util.application.executeCommand
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
@@ -51,7 +49,7 @@ fun invokeMoveFilesOrDirectoriesRefactoring(
} }
project.executeCommand(MoveHandler.REFACTORING_NAME) { project.executeCommand(MoveHandler.REFACTORING_NAME) {
val selectedDir = if (moveDialog != null) moveDialog.targetDirectory else initialTargetDirectory val selectedDir = (if (moveDialog != null) moveDialog.targetDirectory else initialTargetDirectory) ?: return@executeCommand
val updatePackageDirective = (moveDialog as? KotlinAwareMoveFilesOrDirectoriesDialog)?.updatePackageDirective val updatePackageDirective = (moveDialog as? KotlinAwareMoveFilesOrDirectoriesDialog)?.updatePackageDirective
try { try {
@@ -72,40 +70,24 @@ fun invokeMoveFilesOrDirectoriesRefactoring(
) )
elementsToMove.forEach { elementsToMove.forEach {
MoveFilesOrDirectoriesUtil.checkMove(it, selectedDir!!) MoveFilesOrDirectoriesUtil.checkMove(it, selectedDir)
if (it is KtFile && it.isInJavaSourceRoot()) { if (it is KtFile && it.isInJavaSourceRoot()) {
it.updatePackageDirective = updatePackageDirective it.updatePackageDirective = updatePackageDirective
} }
} }
val enableSearchReferences = elements.any { ProjectRootsUtil.isInProjectSource(it) }
if (elementsToMove.isNotEmpty()) { if (elementsToMove.isNotEmpty()) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val processor = if (elementsToMove.all { it is KtFile } && selectedDir != null) { val processor = MoveFilesWithDeclarationsProcessor(
MoveFilesWithDeclarationsProcessor( project,
project, elementsToMove as List<KtFile>,
elementsToMove as List<KtFile>, selectedDir,
selectedDir, null,
null, false,
false, false,
false, moveCallback,
moveCallback, Runnable(::closeDialog)
Runnable(::closeDialog) )
)
}
else {
MoveFilesOrDirectoriesProcessor(
project,
elementsToMove.toTypedArray(),
selectedDir,
enableSearchReferences,
false,
false,
moveCallback,
Runnable(::closeDialog)
)
}
processor.run() processor.run()
} }
else { else {