diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/subPack/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src1/target/pack1/subPack/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src2/pack1/S2.java b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src2/pack1/S2.java new file mode 100644 index 000000000000..0bd2d2024dc6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/after/src2/pack1/S2.java @@ -0,0 +1,3 @@ +package pack1; + +public class S2{} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/subPack/Foo.java b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/subPack/Foo.java new file mode 100644 index 000000000000..2f3c2eddba6f --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/pack1/subPack/Foo.java @@ -0,0 +1,2 @@ +package pack1.subPack; +public class Foo {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/target/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src1/target/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src2/pack1/S2.java b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src2/pack1/S2.java new file mode 100644 index 000000000000..0bd2d2024dc6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/emptySubDirs/before/src2/pack1/S2.java @@ -0,0 +1,3 @@ +package pack1; + +public class S2{} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java index 589f935ec34d..01b8604f0e0a 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java @@ -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); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java index 5517405a568e..c4ca070c32b7 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesProcessor.java @@ -57,6 +57,7 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor private final boolean mySearchInComments; private final boolean mySearchInNonJavaFiles; private final Map myFilesToMove; + private final Map myNestedDirsToMove; private NonCodeUsageInfo[] myNonCodeUsages; private final MoveCallback myMoveCallback; @@ -84,8 +85,9 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor mySearchInNonJavaFiles = searchInNonJavaFiles; myMoveCallback = moveCallback; myFilesToMove = new HashMap(); + myNestedDirsToMove = new HashMap(); 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 files2Move, - PsiDirectory directory, - PsiDirectory rootDirectory, - @NotNull TargetDirectoryWrapper targetDirectory) { + Map 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); } } }