mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-04 17:20:55 +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.UsageInfo;
|
||||||
import com.intellij.usageView.UsageViewDescriptor;
|
import com.intellij.usageView.UsageViewDescriptor;
|
||||||
import com.intellij.usageView.UsageViewUtil;
|
import com.intellij.usageView.UsageViewUtil;
|
||||||
|
import com.intellij.util.ArrayUtil;
|
||||||
import com.intellij.util.IncorrectOperationException;
|
import com.intellij.util.IncorrectOperationException;
|
||||||
import com.intellij.util.Processor;
|
import com.intellij.util.Processor;
|
||||||
import com.intellij.util.VisibilityUtil;
|
import com.intellij.util.VisibilityUtil;
|
||||||
@@ -435,6 +436,26 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
|
|||||||
// Move files with correction of references.
|
// Move files with correction of references.
|
||||||
|
|
||||||
try {
|
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>();
|
Map<PsiElement, PsiElement> oldToNewElementsMapping = new HashMap<PsiElement, PsiElement>();
|
||||||
for (int idx = 0; idx < myElementsToMove.length; idx++) {
|
for (int idx = 0; idx < myElementsToMove.length; idx++) {
|
||||||
PsiElement element = myElementsToMove[idx];
|
PsiElement element = myElementsToMove[idx];
|
||||||
@@ -447,8 +468,9 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor {
|
|||||||
element = newElement;
|
element = newElement;
|
||||||
}
|
}
|
||||||
else if (element instanceof PsiClass) {
|
else if (element instanceof PsiClass) {
|
||||||
MoveClassesOrPackagesUtil.prepareMoveClass((PsiClass)element);
|
final PsiClass psiClass = (PsiClass)element;
|
||||||
final PsiClass newElement = MoveClassesOrPackagesUtil.doMoveClass((PsiClass)element, myMoveDestination.getTargetDirectory(element.getContainingFile()));
|
MoveClassesOrPackagesUtil.prepareMoveClass(psiClass);
|
||||||
|
final PsiClass newElement = MoveClassesOrPackagesUtil.doMoveClass(psiClass, myMoveDestination.getTargetDirectory(element.getContainingFile()), allClasses.get(psiClass));
|
||||||
oldToNewElementsMapping.put(element, newElement);
|
oldToNewElementsMapping.put(element, newElement);
|
||||||
element = newElement;
|
element = newElement;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends DialogWrapper {
|
|||||||
public void run() {
|
public void run() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
processor.run();
|
processor.run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -221,10 +221,17 @@ public class MoveClassesOrPackagesUtil {
|
|||||||
|
|
||||||
// Does not process non-code usages!
|
// Does not process non-code usages!
|
||||||
public static PsiClass doMoveClass(PsiClass aClass, PsiDirectory moveDestination) throws IncorrectOperationException {
|
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;
|
PsiClass newClass;
|
||||||
for (MoveClassHandler handler : MoveClassHandler.EP_NAME.getExtensions()) {
|
if (!moveAllClassesInFile) {
|
||||||
newClass = handler.doMoveClass(aClass, moveDestination);
|
for (MoveClassHandler handler : MoveClassHandler.EP_NAME.getExtensions()) {
|
||||||
if (newClass != null) return newClass;
|
newClass = handler.doMoveClass(aClass, moveDestination);
|
||||||
|
if (newClass != null) return newClass;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PsiFile file = aClass.getContainingFile();
|
PsiFile file = aClass.getContainingFile();
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
package t;
|
package t;
|
||||||
|
|
||||||
class MyClass{}
|
class MyClass{}
|
||||||
|
|
||||||
class MyOneMoreClass{}
|
class MyOneMoreClass{}
|
||||||
@@ -8,4 +8,4 @@ class S11{}
|
|||||||
|
|
||||||
class S12{}
|
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.ModifiableRootModel;
|
||||||
import com.intellij.openapi.roots.ModuleRootManager;
|
import com.intellij.openapi.roots.ModuleRootManager;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
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.JavaPsiFacade;
|
||||||
import com.intellij.psi.PsiDirectory;
|
import com.intellij.psi.PsiDirectory;
|
||||||
import com.intellij.psi.PsiPackage;
|
import com.intellij.psi.PsiPackage;
|
||||||
import com.intellij.refactoring.move.moveClassesOrPackages.MoveDirectoryWithClassesProcessor;
|
import com.intellij.refactoring.move.moveClassesOrPackages.MoveDirectoryWithClassesProcessor;
|
||||||
|
import junit.framework.Assert;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
@@ -37,7 +41,21 @@ public class MovePackageAsDirectoryTest extends MultiFileTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testMultipleClassesInOneFile() throws Exception {
|
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