From 4afbbda858ada401dca2c1eca8f0c81b0dab552a Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Tue, 24 Dec 2019 21:25:38 +0300 Subject: [PATCH] Minor fixes of move refactoring Fix NPE for case when target path for package is not exists Clarify case when target path for file move does not exists Fix NPE when file selector shows with empty edit box of file name in Move dialog --- .../MoveKotlinTopLevelDeclarationsDialog.java | 22 ++++++++++++------- .../ui/MoveKotlinTopLevelDeclarationsModel.kt | 14 +++++++----- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java index 32c831eaeae..8dbd4622ed6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsDialog.java @@ -272,15 +272,21 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { File targetFile1 = new File(fileChooser.getText()); PsiFile targetPsiFile = PhysicalFileSystemUtilsKt.toPsiFile(targetFile1, myProject); - if (targetPsiFile instanceof KtFile) { - dialog.select((KtFile) targetPsiFile); - } - else { - PsiDirectory targetDir = PhysicalFileSystemUtilsKt.toPsiDirectory(targetFile1.getParentFile(), myProject); - if (targetDir == null) { - targetDir = sourceDir; + + if (targetPsiFile != null) { + if (targetPsiFile instanceof KtFile) { + dialog.select((KtFile) targetPsiFile); } - dialog.selectDirectory(targetDir); + else { + PsiDirectory targetDir = PhysicalFileSystemUtilsKt.toPsiDirectory(targetFile1.getParentFile(), myProject); + if (targetDir != null) { + dialog.selectDirectory(targetDir); + } else { + dialog.selectDirectory(sourceDir); + } + } + } else { + dialog.selectDirectory(sourceDir); } dialog.showDialog(); diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsModel.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsModel.kt index 19a76a055ce..7ab5f65dd37 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsModel.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinTopLevelDeclarationsModel.kt @@ -18,7 +18,6 @@ import com.intellij.refactoring.move.MoveCallback import com.intellij.refactoring.move.moveClassesOrPackages.AutocreatingSingleSourceRootMoveDestination import com.intellij.refactoring.move.moveClassesOrPackages.MultipleRootsMoveDestination import com.intellij.util.IncorrectOperationException -import org.jetbrains.kotlin.backend.common.onlyIf import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.core.util.toPsiFile import org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringBundle @@ -67,7 +66,7 @@ internal class MoveKotlinTopLevelDeclarationsModel( val targetPackageWrapper = PackageWrapper(PsiManager.getInstance(project), targetPackage) - return if (selectedPsiDirectory === null) + return if (selectedPsiDirectory == null) TargetDirAndDestination(null, MultipleRootsMoveDestination(targetPackageWrapper)) else { TargetDirAndDestination( @@ -99,6 +98,7 @@ internal class MoveKotlinTopLevelDeclarationsModel( val (targetDir, moveDestination) = selectPackageBasedTargetDirAndDestination() val targetDirectory = moveDestination.getTargetIfExists(sourceDirectory) + ?: throw ConfigurationException("Can't get target directory for selected package") val destination = sourceFiles .mapToSingleOrNull { moveDestination.getTargetIfExists(it) } @@ -155,8 +155,12 @@ internal class MoveKotlinTopLevelDeclarationsModel( } val targetDirPath = targetFile.toPath().parent - val projectBasePath = project.basePath ?: throw ConfigurationException("Can't move for current project") - if (targetDirPath === null || !targetDirPath.startsWith(projectBasePath)) { + ?: throw ConfigurationException("Incorrect target path. Directory is not specified.") + + val projectBasePath = project.basePath + ?: throw ConfigurationException("Can't move for current project") + + if (!targetDirPath.startsWith(projectBasePath)) { throw ConfigurationException("Incorrect target path. Directory $targetDirPath does not belong to current project.") } @@ -222,7 +226,7 @@ internal class MoveKotlinTopLevelDeclarationsModel( if (targetFileName != null) checkTargetFileName(targetFileName) val moveDestination = selectPackageBasedTargetDirAndDestination().destination - val targetDir = moveDestination.getTargetIfExists(sourceDirectory) + val targetDir = moveDestination.getTargetIfExists(sourceDirectory) ?: return null val filesExistingInTargetDir = getFilesExistingInTargetDir(targetFileName, targetDir)