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.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<VirtualFile>,
initialDir: PsiDirectory?
) = randomNullability { contentSourceRoots.randomElementOrNull() }
}
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.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<? extends VirtualFile> contentSourceRoots,
@Nullable PsiDirectory initialDir
) {
return MoveClassesOrPackagesUtil.chooseSourceRoot(newPackage, contentSourceRoots, initialDir);
}
}
private Model<MoveKotlinDeclarationsProcessor> 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() {
@@ -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<MoveKotlinDeclarationsProcessor> {
protected abstract fun chooseSourceRoot(
newPackage: PackageWrapper,
contentSourceRoots: List<VirtualFile>,
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]
}