From 43cc022613443f22479d8b0404fcc73fe04b9f53 Mon Sep 17 00:00:00 2001 From: Andrei Klunnyi Date: Wed, 30 Dec 2020 19:22:36 +0100 Subject: [PATCH] KT-44043 [Sealed interfaces]: quickfix for nested -> to another file --- .../MoveKotlinDeclarationsHandler.kt | 2 +- ...otlinSelectNestedClassRefactoringDialog.kt | 1 + .../ui/MoveKotlinNestedClassesDialog.java | 70 +++++++++++++------ 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsHandler.kt index a412f72ad0b..bea5ba564a6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsHandler.kt @@ -58,7 +58,7 @@ private val defaultHandlerActions = object : MoveKotlinDeclarationsHandlerAction originalClass: KtClassOrObject, targetClass: KtClassOrObject, moveCallback: MoveCallback? - ) = MoveKotlinNestedClassesDialog(project, elementsToMove, originalClass, targetClass, moveCallback).show() + ) = MoveKotlinNestedClassesDialog(project, elementsToMove, originalClass, targetClass, null, moveCallback).show() override fun invokeMoveKotlinTopLevelDeclarationsRefactoring( project: Project, diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/KotlinSelectNestedClassRefactoringDialog.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/KotlinSelectNestedClassRefactoringDialog.kt index 682b26dbb90..dee4a8002b8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/KotlinSelectNestedClassRefactoringDialog.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/KotlinSelectNestedClassRefactoringDialog.kt @@ -92,6 +92,7 @@ internal class KotlinSelectNestedClassRefactoringDialog private constructor( listOf(nestedClass), nestedClass.containingClassOrObject!!, targetContainer as? KtClassOrObject ?: nestedClass.containingClassOrObject!!, + targetContainer as? PsiDirectory, null ) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesDialog.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesDialog.java index b47744a7fb5..0a192e7c68e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesDialog.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/ui/MoveKotlinNestedClassesDialog.java @@ -9,11 +9,11 @@ import com.intellij.ide.util.TreeClassChooser; import com.intellij.ide.util.TreeJavaClassChooserDialog; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.DocumentListener; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; +import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.classMembers.AbstractMemberInfoModel; @@ -58,11 +58,16 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog { private KotlinMemberSelectionTable memberTable; private PsiElement targetClass; + @Nullable + private PsiDirectory targetDirectory; + private GlobalSearchScope searchScope; + public MoveKotlinNestedClassesDialog( @NotNull Project project, @NotNull List elementsToMove, @NotNull KtClassOrObject originalClass, @NotNull KtClassOrObject targetClass, + @Nullable PsiDirectory targetDirectory, @Nullable MoveCallback moveCallback ) { super(project, true); @@ -70,6 +75,13 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog { this.originalClass = originalClass; this.targetClass = targetClass; this.moveCallback = moveCallback; + this.targetDirectory = targetDirectory; + this.searchScope = GlobalSearchScope.projectScope(project); + if (targetDirectory != null) { + Module module = ModuleUtilCore.findModuleForPsiElement(targetDirectory); + if (module != null) + this.searchScope = module.getModuleScope(); + } init(); @@ -103,22 +115,8 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog { TreeClassChooser chooser = new TreeJavaClassChooserDialog( RefactoringBundle.message("choose.destination.class"), myProject, - GlobalSearchScope.projectScope(myProject), - aClass -> { - if (!(aClass instanceof KtLightClassForSourceDeclaration)) return false; - KtClassOrObject classOrObject = ((KtLightClassForSourceDeclaration) aClass).getKotlinOrigin(); - - if (classOrObject instanceof KtObjectDeclaration) { - return !((KtObjectDeclaration) classOrObject).isObjectLiteral(); - } - - if (classOrObject instanceof KtClass) { - KtClass ktClass = (KtClass) classOrObject; - return !(ktClass.isInner() || ktClass.isAnnotation()); - } - - return false; - }, + searchScope, + MoveKotlinNestedClassesDialog.this::classMatchesFilter, null, null, true @@ -170,7 +168,7 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog { public void documentChanged(@NotNull DocumentEvent e) { PsiClass aClass = JavaPsiFacade .getInstance(myProject) - .findClass(targetClassChooser.getText(), GlobalSearchScope.projectScope(myProject)); + .findClass(targetClassChooser.getText(), searchScope); targetClass = aClass instanceof KtLightClassForSourceDeclaration ? ((KtLightClassForSourceDeclaration) aClass).getKotlinOrigin() : aClass; @@ -181,6 +179,38 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog { targetClassChooserPanel.add(targetClassChooser); } + private boolean classMatchesFilter(PsiClass aClass) { + if (!searchScope.accept(aClass.getContainingFile().getVirtualFile())) + return false; + + if (targetDirectory != null) { + PsiPackage targetPackage = JavaDirectoryService.getInstance().getPackage(targetDirectory); + if (targetPackage != null) { + PsiDirectory directory = aClass.getContainingFile().getContainingDirectory(); + PsiPackage classPackage = JavaDirectoryService.getInstance().getPackage(directory); + if (classPackage != null + && !targetPackage.getQualifiedName().equals(classPackage.getQualifiedName())) + { + return false; + } + } + } + + if (!(aClass instanceof KtLightClassForSourceDeclaration)) return false; + KtClassOrObject classOrObject = ((KtLightClassForSourceDeclaration) aClass).getKotlinOrigin(); + + if (classOrObject instanceof KtObjectDeclaration) { + return !((KtObjectDeclaration) classOrObject).isObjectLiteral(); + } + + if (classOrObject instanceof KtClass) { + KtClass ktClass = (KtClass) classOrObject; + return !(ktClass.isInner() || ktClass.isAnnotation()); + } + + return false; + } + private void initMemberInfo(@NotNull List elementsToMove) { List memberInfos = CollectionsKt.mapNotNull( originalClass.getDeclarations(),