KT-44043 [Sealed interfaces]: quickfix for nested -> to another file

This commit is contained in:
Andrei Klunnyi
2020-12-30 19:22:36 +01:00
parent da98fc4b07
commit 43cc022613
3 changed files with 52 additions and 21 deletions
@@ -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,
@@ -92,6 +92,7 @@ internal class KotlinSelectNestedClassRefactoringDialog private constructor(
listOf(nestedClass),
nestedClass.containingClassOrObject!!,
targetContainer as? KtClassOrObject ?: nestedClass.containingClassOrObject!!,
targetContainer as? PsiDirectory,
null
)
}
@@ -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<KtClassOrObject> 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<KtClassOrObject> elementsToMove) {
List<KotlinMemberInfo> memberInfos = CollectionsKt.mapNotNull(
originalClass.getDeclarations(),