KT-44043 [Sealed interfaces]: quickfix for nested -> to another file
This commit is contained in:
+1
-1
@@ -58,7 +58,7 @@ private val defaultHandlerActions = object : MoveKotlinDeclarationsHandlerAction
|
|||||||
originalClass: KtClassOrObject,
|
originalClass: KtClassOrObject,
|
||||||
targetClass: KtClassOrObject,
|
targetClass: KtClassOrObject,
|
||||||
moveCallback: MoveCallback?
|
moveCallback: MoveCallback?
|
||||||
) = MoveKotlinNestedClassesDialog(project, elementsToMove, originalClass, targetClass, moveCallback).show()
|
) = MoveKotlinNestedClassesDialog(project, elementsToMove, originalClass, targetClass, null, moveCallback).show()
|
||||||
|
|
||||||
override fun invokeMoveKotlinTopLevelDeclarationsRefactoring(
|
override fun invokeMoveKotlinTopLevelDeclarationsRefactoring(
|
||||||
project: Project,
|
project: Project,
|
||||||
|
|||||||
+1
@@ -92,6 +92,7 @@ internal class KotlinSelectNestedClassRefactoringDialog private constructor(
|
|||||||
listOf(nestedClass),
|
listOf(nestedClass),
|
||||||
nestedClass.containingClassOrObject!!,
|
nestedClass.containingClassOrObject!!,
|
||||||
targetContainer as? KtClassOrObject ?: nestedClass.containingClassOrObject!!,
|
targetContainer as? KtClassOrObject ?: nestedClass.containingClassOrObject!!,
|
||||||
|
targetContainer as? PsiDirectory,
|
||||||
null
|
null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+50
-20
@@ -9,11 +9,11 @@ import com.intellij.ide.util.TreeClassChooser;
|
|||||||
import com.intellij.ide.util.TreeJavaClassChooserDialog;
|
import com.intellij.ide.util.TreeJavaClassChooserDialog;
|
||||||
import com.intellij.openapi.editor.event.DocumentEvent;
|
import com.intellij.openapi.editor.event.DocumentEvent;
|
||||||
import com.intellij.openapi.editor.event.DocumentListener;
|
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.options.ConfigurationException;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.psi.JavaPsiFacade;
|
import com.intellij.psi.*;
|
||||||
import com.intellij.psi.PsiClass;
|
|
||||||
import com.intellij.psi.PsiElement;
|
|
||||||
import com.intellij.psi.search.GlobalSearchScope;
|
import com.intellij.psi.search.GlobalSearchScope;
|
||||||
import com.intellij.refactoring.RefactoringBundle;
|
import com.intellij.refactoring.RefactoringBundle;
|
||||||
import com.intellij.refactoring.classMembers.AbstractMemberInfoModel;
|
import com.intellij.refactoring.classMembers.AbstractMemberInfoModel;
|
||||||
@@ -58,11 +58,16 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog {
|
|||||||
private KotlinMemberSelectionTable memberTable;
|
private KotlinMemberSelectionTable memberTable;
|
||||||
private PsiElement targetClass;
|
private PsiElement targetClass;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private PsiDirectory targetDirectory;
|
||||||
|
private GlobalSearchScope searchScope;
|
||||||
|
|
||||||
public MoveKotlinNestedClassesDialog(
|
public MoveKotlinNestedClassesDialog(
|
||||||
@NotNull Project project,
|
@NotNull Project project,
|
||||||
@NotNull List<KtClassOrObject> elementsToMove,
|
@NotNull List<KtClassOrObject> elementsToMove,
|
||||||
@NotNull KtClassOrObject originalClass,
|
@NotNull KtClassOrObject originalClass,
|
||||||
@NotNull KtClassOrObject targetClass,
|
@NotNull KtClassOrObject targetClass,
|
||||||
|
@Nullable PsiDirectory targetDirectory,
|
||||||
@Nullable MoveCallback moveCallback
|
@Nullable MoveCallback moveCallback
|
||||||
) {
|
) {
|
||||||
super(project, true);
|
super(project, true);
|
||||||
@@ -70,6 +75,13 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog {
|
|||||||
this.originalClass = originalClass;
|
this.originalClass = originalClass;
|
||||||
this.targetClass = targetClass;
|
this.targetClass = targetClass;
|
||||||
this.moveCallback = moveCallback;
|
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();
|
init();
|
||||||
|
|
||||||
@@ -103,22 +115,8 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog {
|
|||||||
TreeClassChooser chooser = new TreeJavaClassChooserDialog(
|
TreeClassChooser chooser = new TreeJavaClassChooserDialog(
|
||||||
RefactoringBundle.message("choose.destination.class"),
|
RefactoringBundle.message("choose.destination.class"),
|
||||||
myProject,
|
myProject,
|
||||||
GlobalSearchScope.projectScope(myProject),
|
searchScope,
|
||||||
aClass -> {
|
MoveKotlinNestedClassesDialog.this::classMatchesFilter,
|
||||||
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;
|
|
||||||
},
|
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
true
|
true
|
||||||
@@ -170,7 +168,7 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog {
|
|||||||
public void documentChanged(@NotNull DocumentEvent e) {
|
public void documentChanged(@NotNull DocumentEvent e) {
|
||||||
PsiClass aClass = JavaPsiFacade
|
PsiClass aClass = JavaPsiFacade
|
||||||
.getInstance(myProject)
|
.getInstance(myProject)
|
||||||
.findClass(targetClassChooser.getText(), GlobalSearchScope.projectScope(myProject));
|
.findClass(targetClassChooser.getText(), searchScope);
|
||||||
targetClass = aClass instanceof KtLightClassForSourceDeclaration
|
targetClass = aClass instanceof KtLightClassForSourceDeclaration
|
||||||
? ((KtLightClassForSourceDeclaration) aClass).getKotlinOrigin()
|
? ((KtLightClassForSourceDeclaration) aClass).getKotlinOrigin()
|
||||||
: aClass;
|
: aClass;
|
||||||
@@ -181,6 +179,38 @@ public class MoveKotlinNestedClassesDialog extends RefactoringDialog {
|
|||||||
targetClassChooserPanel.add(targetClassChooser);
|
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) {
|
private void initMemberInfo(@NotNull List<KtClassOrObject> elementsToMove) {
|
||||||
List<KotlinMemberInfo> memberInfos = CollectionsKt.mapNotNull(
|
List<KotlinMemberInfo> memberInfos = CollectionsKt.mapNotNull(
|
||||||
originalClass.getDeclarations(),
|
originalClass.getDeclarations(),
|
||||||
|
|||||||
Reference in New Issue
Block a user