move file instead of splitting in classes when all classes in file are moved (IDEA-66437)

This commit is contained in:
anna
2011-03-14 12:58:02 +01:00
parent cc332d6529
commit 2f32d06e43
6 changed files with 55 additions and 9 deletions

View File

@@ -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 {

View File

@@ -211,6 +211,7 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends DialogWrapper {
public void run() { public void run() {
} }
}); });
processor.run(); processor.run();
} }
} }

View File

@@ -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();

View File

@@ -1,5 +1,3 @@
package t; package t;
class MyClass{} class MyClass{}
class MyOneMoreClass{} class MyOneMoreClass{}

View File

@@ -8,4 +8,4 @@ class S11{}
class S12{} class S12{}
class S13{} class S13{}

View File

@@ -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]);
} }