mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
preserve empty packages when move/rename package as directory (IDEA-111902)
This commit is contained in:
+3
@@ -0,0 +1,3 @@
|
||||
package pack1;
|
||||
|
||||
public class S2{}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
package pack1.subPack;
|
||||
public class Foo {}
|
||||
+3
@@ -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);
|
||||
}
|
||||
|
||||
+14
-5
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user