Added possibility to override Path Chooser for MoveKotlinNestedClassesToUpperLevelModel

This commit is contained in:
Igor Yakovlev
2019-08-30 20:56:18 +03:00
parent 99972a08a1
commit 0eea2479fc
3 changed files with 53 additions and 7 deletions
@@ -7,9 +7,11 @@ package org.jetbrains.kotlin.idea.actions.internal.refactoringTesting.cases
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFileSystemItem import com.intellij.psi.PsiFileSystemItem
import com.intellij.refactoring.PackageWrapper
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 org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
@@ -112,7 +114,7 @@ internal class MoveKotlinDeclarationsHandlerTestActions(private val caseDataKeep
?: outerClass.containingClassOrObject ?: outerClass.containingClassOrObject
?: outerClass.containingFile.let { it.containingDirectory ?: it } ?: outerClass.containingFile.let { it.containingDirectory ?: it }
val model = MoveKotlinNestedClassesToUpperLevelModel( val model = object : MoveKotlinNestedClassesToUpperLevelModel(
project = nestedClass.project, project = nestedClass.project,
innerClass = nestedClass, innerClass = nestedClass,
target = newTarget, target = newTarget,
@@ -123,7 +125,13 @@ internal class MoveKotlinDeclarationsHandlerTestActions(private val caseDataKeep
isSearchInNonJavaFiles = randomBoolean(), isSearchInNonJavaFiles = randomBoolean(),
packageName = randomClassName(), packageName = randomClassName(),
isOpenInEditor = false isOpenInEditor = false
) ) {
override fun chooseSourceRoot(
newPackage: PackageWrapper,
contentSourceRoots: List<VirtualFile>,
initialDir: PsiDirectory?
) = randomNullability { contentSourceRoots.randomElementOrNull() }
}
caseDataKeeper.caseData = model.testDataString() caseDataKeeper.caseData = model.testDataString()
@@ -7,11 +7,14 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui;
import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.refactoring.HelpID; import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.move.MoveDialogBase; import com.intellij.refactoring.move.MoveDialogBase;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesUtil;
import com.intellij.refactoring.ui.NameSuggestionsField; import com.intellij.refactoring.ui.NameSuggestionsField;
import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo; import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo;
import com.intellij.ui.EditorTextField; import com.intellij.ui.EditorTextField;
@@ -200,8 +203,37 @@ public class MoveKotlinNestedClassesToUpperLevelDialog extends MoveDialogBase {
return null; 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<? extends VirtualFile> contentSourceRoots,
@Nullable PsiDirectory initialDir
) {
return MoveClassesOrPackagesUtil.chooseSourceRoot(newPackage, contentSourceRoots, initialDir);
}
}
private Model<MoveKotlinDeclarationsProcessor> getModel() { private Model<MoveKotlinDeclarationsProcessor> getModel() {
return new MoveKotlinNestedClassesToUpperLevelModel( return new MoveKotlinNestedClassesToUpperLevelModelWithUIChooser(
project, project,
innerClass, innerClass,
targetContainer, targetContainer,
@@ -211,10 +243,10 @@ public class MoveKotlinNestedClassesToUpperLevelDialog extends MoveDialogBase {
searchInCommentsCheckBox.isSelected(), searchInCommentsCheckBox.isSelected(),
searchForTextOccurrencesCheckBox.isSelected(), searchForTextOccurrencesCheckBox.isSelected(),
packageNameField.getText(), packageNameField.getText(),
isOpenInEditor()); isOpenInEditor()
);
} }
@Override @Override
protected void doAction() { protected void doAction() {
@@ -38,7 +38,7 @@ import org.jetbrains.kotlin.psi.psiUtil.isIdentifier
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
internal class MoveKotlinNestedClassesToUpperLevelModel( internal abstract class MoveKotlinNestedClassesToUpperLevelModel(
val project: Project, val project: Project,
val innerClass: KtClassOrObject, val innerClass: KtClassOrObject,
val target: PsiElement, val target: PsiElement,
@@ -51,6 +51,12 @@ internal class MoveKotlinNestedClassesToUpperLevelModel(
val isOpenInEditor: Boolean val isOpenInEditor: Boolean
) : Model<MoveKotlinDeclarationsProcessor> { ) : Model<MoveKotlinDeclarationsProcessor> {
protected abstract fun chooseSourceRoot(
newPackage: PackageWrapper,
contentSourceRoots: List<VirtualFile>,
initialDir: PsiDirectory?
): VirtualFile?
private val innerClassDescriptor = innerClass.unsafeResolveToDescriptor(BodyResolveMode.FULL) as ClassDescriptor private val innerClassDescriptor = innerClass.unsafeResolveToDescriptor(BodyResolveMode.FULL) as ClassDescriptor
private fun getTargetContainer(): PsiElement? { 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 { } else {
targetSourceRoot = contentSourceRoots[0] targetSourceRoot = contentSourceRoots[0]
} }