mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-07 22:09:38 +07:00
move file instead of splitting in classes when all classes in file are moved (IDEA-66437)
This commit is contained in:
@@ -45,6 +45,7 @@ import com.intellij.refactoring.util.classRefs.ClassReferenceScanner;
|
||||
import com.intellij.usageView.UsageInfo;
|
||||
import com.intellij.usageView.UsageViewDescriptor;
|
||||
import com.intellij.usageView.UsageViewUtil;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.Processor;
|
||||
import com.intellij.util.VisibilityUtil;
|
||||
@@ -435,6 +436,26 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
|
||||
// Move files with correction of references.
|
||||
|
||||
try {
|
||||
final Map<PsiClass, Boolean> allClasses = new HashMap<PsiClass, Boolean>();
|
||||
for (PsiElement element : myElementsToMove) {
|
||||
if (element instanceof PsiClass) {
|
||||
final PsiClass psiClass = (PsiClass)element;
|
||||
if (allClasses.containsKey(psiClass)) {
|
||||
continue;
|
||||
}
|
||||
final PsiClass[] classes = ((PsiClassOwner)element.getContainingFile()).getClasses();
|
||||
boolean all = true;
|
||||
for (PsiClass aClass : classes) {
|
||||
if (ArrayUtil.find(myElementsToMove, aClass) == -1) {
|
||||
all = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (PsiClass aClass : classes) {
|
||||
allClasses.put(aClass, all);
|
||||
}
|
||||
}
|
||||
}
|
||||
Map<PsiElement, PsiElement> oldToNewElementsMapping = new HashMap<PsiElement, PsiElement>();
|
||||
for (int idx = 0; idx < myElementsToMove.length; idx++) {
|
||||
PsiElement element = myElementsToMove[idx];
|
||||
@@ -447,8 +468,9 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
|
||||
element = newElement;
|
||||
}
|
||||
else if (element instanceof PsiClass) {
|
||||
MoveClassesOrPackagesUtil.prepareMoveClass((PsiClass)element);
|
||||
final PsiClass newElement = MoveClassesOrPackagesUtil.doMoveClass((PsiClass)element, myMoveDestination.getTargetDirectory(element.getContainingFile()));
|
||||
final PsiClass psiClass = (PsiClass)element;
|
||||
MoveClassesOrPackagesUtil.prepareMoveClass(psiClass);
|
||||
final PsiClass newElement = MoveClassesOrPackagesUtil.doMoveClass(psiClass, myMoveDestination.getTargetDirectory(element.getContainingFile()), allClasses.get(psiClass));
|
||||
oldToNewElementsMapping.put(element, newElement);
|
||||
element = newElement;
|
||||
} else {
|
||||
|
||||
@@ -211,6 +211,7 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends DialogWrapper {
|
||||
public void run() {
|
||||
}
|
||||
});
|
||||
|
||||
processor.run();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,10 +221,17 @@ public class MoveClassesOrPackagesUtil {
|
||||
|
||||
// Does not process non-code usages!
|
||||
public static PsiClass doMoveClass(PsiClass aClass, PsiDirectory moveDestination) throws IncorrectOperationException {
|
||||
return doMoveClass(aClass, moveDestination, true);
|
||||
}
|
||||
|
||||
// Does not process non-code usages!
|
||||
public static PsiClass doMoveClass(PsiClass aClass, PsiDirectory moveDestination, boolean moveAllClassesInFile) throws IncorrectOperationException {
|
||||
PsiClass newClass;
|
||||
for (MoveClassHandler handler : MoveClassHandler.EP_NAME.getExtensions()) {
|
||||
newClass = handler.doMoveClass(aClass, moveDestination);
|
||||
if (newClass != null) return newClass;
|
||||
if (!moveAllClassesInFile) {
|
||||
for (MoveClassHandler handler : MoveClassHandler.EP_NAME.getExtensions()) {
|
||||
newClass = handler.doMoveClass(aClass, moveDestination);
|
||||
if (newClass != null) return newClass;
|
||||
}
|
||||
}
|
||||
|
||||
PsiFile file = aClass.getContainingFile();
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
package t;
|
||||
|
||||
class MyClass{}
|
||||
|
||||
class MyOneMoreClass{}
|
||||
@@ -8,4 +8,4 @@ class S11{}
|
||||
|
||||
class S12{}
|
||||
|
||||
class S13{}
|
||||
class S13{}
|
||||
|
||||
@@ -8,10 +8,14 @@ import com.intellij.openapi.roots.ContentEntry;
|
||||
import com.intellij.openapi.roots.ModifiableRootModel;
|
||||
import com.intellij.openapi.roots.ModuleRootManager;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileAdapter;
|
||||
import com.intellij.openapi.vfs.VirtualFileEvent;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import com.intellij.psi.JavaPsiFacade;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import com.intellij.refactoring.move.moveClassesOrPackages.MoveDirectoryWithClassesProcessor;
|
||||
import junit.framework.Assert;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
@@ -37,7 +41,21 @@ public class MovePackageAsDirectoryTest extends MultiFileTestCase {
|
||||
}
|
||||
|
||||
public void testMultipleClassesInOneFile() throws Exception {
|
||||
doTest(createAction("pack1", "target"));
|
||||
final boolean [] fileWasDeleted = new boolean[]{false};
|
||||
final VirtualFileAdapter fileAdapter = new VirtualFileAdapter() {
|
||||
@Override
|
||||
public void fileDeleted(VirtualFileEvent event) {
|
||||
fileWasDeleted[0] = !event.getFile().isDirectory();
|
||||
}
|
||||
};
|
||||
VirtualFileManager.getInstance().addVirtualFileListener(fileAdapter);
|
||||
try {
|
||||
doTest(createAction("pack1", "target"));
|
||||
}
|
||||
finally {
|
||||
VirtualFileManager.getInstance().removeVirtualFileListener(fileAdapter);
|
||||
}
|
||||
Assert.assertFalse("Deleted instead of moved", fileWasDeleted[0]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user