diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/internal/refactoringTesting/cases/MoveKotlinDeclarationsHandlerTestActions.kt b/idea/src/org/jetbrains/kotlin/idea/actions/internal/refactoringTesting/cases/MoveKotlinDeclarationsHandlerTestActions.kt index ac566f84cca..214ce46b01c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/internal/refactoringTesting/cases/MoveKotlinDeclarationsHandlerTestActions.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/internal/refactoringTesting/cases/MoveKotlinDeclarationsHandlerTestActions.kt @@ -7,9 +7,11 @@ package org.jetbrains.kotlin.idea.actions.internal.refactoringTesting.cases import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement import com.intellij.psi.PsiFileSystemItem +import com.intellij.refactoring.PackageWrapper import com.intellij.refactoring.move.MoveCallback import com.intellij.refactoring.move.MoveHandler import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName @@ -112,7 +114,7 @@ internal class MoveKotlinDeclarationsHandlerTestActions(private val caseDataKeep ?: outerClass.containingClassOrObject ?: outerClass.containingFile.let { it.containingDirectory ?: it } - val model = MoveKotlinNestedClassesToUpperLevelModel( + val model = object : MoveKotlinNestedClassesToUpperLevelModel( project = nestedClass.project, innerClass = nestedClass, target = newTarget, @@ -123,7 +125,13 @@ internal class MoveKotlinDeclarationsHandlerTestActions(private val caseDataKeep isSearchInNonJavaFiles = randomBoolean(), packageName = randomClassName(), isOpenInEditor = false - ) + ) { + override fun chooseSourceRoot( + newPackage: PackageWrapper, + contentSourceRoots: List, + initialDir: PsiDirectory? + ) = randomNullability { contentSourceRoots.randomElementOrNull() } + } caseDataKeeper.caseData = model.testDataString() diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesToUpperLevelDialog.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesToUpperLevelDialog.java index 50f0703c266..a90f9a12740 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesToUpperLevelDialog.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesToUpperLevelDialog.java @@ -7,11 +7,14 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.refactoring.HelpID; +import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.move.MoveDialogBase; +import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesUtil; import com.intellij.refactoring.ui.NameSuggestionsField; import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo; import com.intellij.ui.EditorTextField; @@ -200,8 +203,37 @@ public class MoveKotlinNestedClassesToUpperLevelDialog extends MoveDialogBase { return null; } + + private static class MoveKotlinNestedClassesToUpperLevelModelWithUIChooser extends MoveKotlinNestedClassesToUpperLevelModel { + public MoveKotlinNestedClassesToUpperLevelModelWithUIChooser( + @NotNull Project project, + @NotNull KtClassOrObject innerClass, + @NotNull PsiElement target, + @Nullable String parameter, + @NotNull String className, + boolean passOuterClass, + boolean searchInComments, + boolean isSearchInNonJavaFiles, + @NotNull String packageName, + boolean isOpenInEditor + ) { + super(project, innerClass, target, parameter, className, passOuterClass, searchInComments, isSearchInNonJavaFiles, packageName, + isOpenInEditor); + } + + @Nullable + @Override + protected VirtualFile chooseSourceRoot( + @NotNull PackageWrapper newPackage, + @NotNull List contentSourceRoots, + @Nullable PsiDirectory initialDir + ) { + return MoveClassesOrPackagesUtil.chooseSourceRoot(newPackage, contentSourceRoots, initialDir); + } + } + private Model getModel() { - return new MoveKotlinNestedClassesToUpperLevelModel( + return new MoveKotlinNestedClassesToUpperLevelModelWithUIChooser( project, innerClass, targetContainer, @@ -211,10 +243,10 @@ public class MoveKotlinNestedClassesToUpperLevelDialog extends MoveDialogBase { searchInCommentsCheckBox.isSelected(), searchForTextOccurrencesCheckBox.isSelected(), packageNameField.getText(), - isOpenInEditor()); + isOpenInEditor() + ); } - @Override protected void doAction() { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesToUpperLevelModel.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesToUpperLevelModel.kt index 1e2bab28977..9ddb3892a7a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesToUpperLevelModel.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesToUpperLevelModel.kt @@ -38,7 +38,7 @@ import org.jetbrains.kotlin.psi.psiUtil.isIdentifier import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -internal class MoveKotlinNestedClassesToUpperLevelModel( +internal abstract class MoveKotlinNestedClassesToUpperLevelModel( val project: Project, val innerClass: KtClassOrObject, val target: PsiElement, @@ -51,6 +51,12 @@ internal class MoveKotlinNestedClassesToUpperLevelModel( val isOpenInEditor: Boolean ) : Model { + protected abstract fun chooseSourceRoot( + newPackage: PackageWrapper, + contentSourceRoots: List, + initialDir: PsiDirectory? + ): VirtualFile? + private val innerClassDescriptor = innerClass.unsafeResolveToDescriptor(BodyResolveMode.FULL) as ClassDescriptor private fun getTargetContainer(): PsiElement? { @@ -77,7 +83,7 @@ internal class MoveKotlinNestedClassesToUpperLevelModel( } } - targetSourceRoot = MoveClassesOrPackagesUtil.chooseSourceRoot(newPackage, contentSourceRoots, initialDir) ?: return null + targetSourceRoot = chooseSourceRoot(newPackage, contentSourceRoots, initialDir) ?: return null } else { targetSourceRoot = contentSourceRoots[0] }