From e413395cbfe46e2f528b267db14c065f0c9a80a1 Mon Sep 17 00:00:00 2001 From: Vadim Brilyantov Date: Thu, 31 Jan 2019 16:48:46 +0300 Subject: [PATCH] #KT-19661: Create missing directories when moving to a user-defined path --- .../MoveKotlinTopLevelDeclarationsDialog.java | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 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 e1a67344dd1..e6bee88b33f 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 @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui; import com.intellij.ide.util.DirectoryChooser; +import com.intellij.ide.util.DirectoryUtil; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.DocumentListener; @@ -75,6 +76,8 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; +import java.nio.file.Path; +import java.util.*; import java.util.List; import java.util.*; @@ -100,6 +103,7 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { private JCheckBox cbUpdatePackageDirective; private JCheckBox cbSearchReferences; private KotlinMemberSelectionTable memberTable; + public MoveKotlinTopLevelDeclarationsDialog( @NotNull Project project, @NotNull Set elementsToMove, @@ -557,7 +561,8 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { targetFile.getVirtualFile().getPath() ); int ret = - Messages.showYesNoDialog(myProject, question, RefactoringBundle.message("move.title"), Messages.getQuestionIcon()); + Messages.showYesNoDialog(myProject, question, RefactoringBundle.message("move.title"), + Messages.getQuestionIcon()); if (ret != Messages.YES) return null; } } @@ -591,7 +596,31 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { return new KotlinMoveTargetForExistingElement(jetFile); } - File targetDir = targetFile.getParentFile(); + Path targetFilePath = targetFile.toPath(); + Path targetDirPath = targetFilePath.getParent(); + if (targetDirPath == null || !targetDirPath.startsWith(getProject().getBasePath())) { + setErrorText("Incorrect target path. Directory " + targetDirPath + " does not belong to current project."); + return null; + } + if (KotlinRefactoringUtilKt.toPsiDirectory(targetDirPath.toFile(), myProject) == null) { + int ret = Messages.showYesNoDialog( + myProject, + "You are about to move all declarations to the directory that does not exist. Do you want to create it?", + RefactoringBundle.message("move.title"), + Messages.getQuestionIcon() + ); + if (ret == Messages.YES) { + try { + DirectoryUtil.mkdirs(PsiManager.getInstance(getProject()), targetDirPath.toString()); + } + catch (IncorrectOperationException e) { + setErrorText("Failed to create parent directory: " + targetDirPath); + return null; + } + } + } + + File targetDir = targetDirPath.toFile(); final PsiDirectory psiDirectory = targetDir != null ? KotlinRefactoringUtilKt.toPsiDirectory(targetDir, myProject) : null; if (psiDirectory == null) { setErrorText("No directory found for file: " + targetFile.getPath()); @@ -718,7 +747,8 @@ public class MoveKotlinTopLevelDeclarationsDialog extends RefactoringDialog { if (isFullFileMove()) { if (isMoveToPackage()) { - Pair sourceRootWithMoveDestination = selectPackageBasedTargetDirAndDestination(false); + Pair sourceRootWithMoveDestination = + selectPackageBasedTargetDirAndDestination(false); //noinspection ConstantConditions final MoveDestination moveDestination = sourceRootWithMoveDestination.getSecond();