preserve empty packages when move/rename package as directory (IDEA-111902)

This commit is contained in:
Anna Kozlova
2013-08-15 13:50:01 +04:00
parent 2a5270d072
commit 936228a8f7
10 changed files with 55 additions and 10 deletions
@@ -0,0 +1,3 @@
package pack1;
public class S2{}
@@ -0,0 +1,2 @@
package pack1.subPack;
public class Foo {}
@@ -0,0 +1,3 @@
package pack1;
public class S2{}
@@ -22,10 +22,8 @@ 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.PsiFile;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveDirectoryWithClassesProcessor;
import com.intellij.testFramework.PsiTestUtil;
import junit.framework.Assert;
@@ -80,10 +78,10 @@ public class MovePackageAsDirectoryTest extends MultiFileTestCase {
doTest(createAction("pack1", "target"));
}
private static final String EMPTY_TXT = "empty.txt";
public void testXmlEmptyDirRefs() throws Exception {
final String packageName = "pack1";
doTest(new MyPerformAction(packageName, "target"){
private static final String EMPTY_TXT = "empty.txt";
@Override
protected void preprocessSrcDir(PsiDirectory srcDirectory) {
final PsiFile empty = srcDirectory.findFile(EMPTY_TXT);
@@ -108,6 +106,36 @@ public class MovePackageAsDirectoryTest extends MultiFileTestCase {
});
}
public void testEmptySubDirs() throws Exception {
final String packageName = "pack1";
doTest(new MyPerformAction(packageName, "target"){
private static final String FOO = "pack1.subPack.Foo";
@Override
protected void preprocessSrcDir(PsiDirectory srcDirectory) {
final PsiClass empty = JavaPsiFacade.getInstance(getProject()).findClass(FOO, GlobalSearchScope.projectScope(getProject()));
assert empty != null;
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
empty.delete();
}
});
}
@Override
protected void postProcessTargetDir(PsiDirectory targetDirectory) {
final PsiDirectory subdirectory = targetDirectory.findSubdirectory(packageName);
assert subdirectory != null;
final PsiDirectory emptyDir = subdirectory.findSubdirectory("subPack");
assert emptyDir != null;
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
emptyDir.createFile(EMPTY_TXT);
}
});
}
});
}
private PerformAction createAction(final String packageName, final String targetPackageName) {
return new MyPerformAction(packageName, targetPackageName);
}
@@ -57,6 +57,7 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor
private final boolean mySearchInComments;
private final boolean mySearchInNonJavaFiles;
private final Map<PsiFile, TargetDirectoryWrapper> myFilesToMove;
private final Map<PsiDirectory, TargetDirectoryWrapper> myNestedDirsToMove;
private NonCodeUsageInfo[] myNonCodeUsages;
private final MoveCallback myMoveCallback;
@@ -84,8 +85,9 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor
mySearchInNonJavaFiles = searchInNonJavaFiles;
myMoveCallback = moveCallback;
myFilesToMove = new HashMap<PsiFile, TargetDirectoryWrapper>();
myNestedDirsToMove = new HashMap<PsiDirectory, TargetDirectoryWrapper>();
for (PsiDirectory dir : directories) {
collectFiles2Move(myFilesToMove, dir, includeSelf ? dir.getParentDirectory() : dir, getTargetDirectory(dir));
collectFiles2Move(myFilesToMove, myNestedDirsToMove, dir, includeSelf ? dir.getParentDirectory() : dir, getTargetDirectory(dir));
}
}
@@ -140,6 +142,11 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor
for (PsiDirectory directory : myDirectories) {
getResultDirectory(directory).findOrCreateTargetDirectory();
}
for (PsiDirectory directory : myNestedDirsToMove.keySet()) {
myNestedDirsToMove.get(directory).findOrCreateTargetDirectory();
}
for (PsiFile psiFile : myFilesToMove.keySet()) {
myFilesToMove.get(psiFile).findOrCreateTargetDirectory();
}
@@ -212,21 +219,23 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor
}
private static void collectFiles2Move(Map<PsiFile, TargetDirectoryWrapper> files2Move,
PsiDirectory directory,
PsiDirectory rootDirectory,
@NotNull TargetDirectoryWrapper targetDirectory) {
Map<PsiDirectory, TargetDirectoryWrapper> nestedDirsToMove,
PsiDirectory directory,
PsiDirectory rootDirectory,
@NotNull TargetDirectoryWrapper targetDirectory) {
final PsiElement[] children = directory.getChildren();
final String relativePath = VfsUtilCore.getRelativePath(directory.getVirtualFile(), rootDirectory.getVirtualFile(), '/');
final TargetDirectoryWrapper newTargetDirectory = relativePath.length() == 0
? targetDirectory
: targetDirectory.findOrCreateChild(relativePath);
nestedDirsToMove.put(directory, newTargetDirectory);
for (PsiElement child : children) {
if (child instanceof PsiFile) {
files2Move.put((PsiFile)child, newTargetDirectory);
}
else if (child instanceof PsiDirectory){
collectFiles2Move(files2Move, (PsiDirectory)child, directory, newTargetDirectory);
collectFiles2Move(files2Move, nestedDirsToMove, (PsiDirectory)child, directory, newTargetDirectory);
}
}
}