rename package: ensure move targets are not deleted (IDEA-177845)

This commit is contained in:
Anna.Kozlova
2017-08-21 16:21:43 +02:00
parent 43cde89569
commit 85fb323064
4 changed files with 41 additions and 4 deletions
@@ -0,0 +1,3 @@
package pack1.pack2;
public class S1{}
@@ -0,0 +1,3 @@
package pack1;
public class S1{}
@@ -64,6 +64,18 @@ public class MovePackageAsDirectoryTest extends MultiFileTestCase {
doTest(action);
}
public void testRenamePackageUp() {
final PerformAction action = (rootDir, rootAfter) -> {
final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(myProject);
final PsiPackage sourcePackage = psiFacade.findPackage("pack1.pack2");
assertNotNull(sourcePackage);
RenamePsiPackageProcessor.createRenameMoveProcessor("pack1", sourcePackage, false, false).run();
FileDocumentManager.getInstance().saveAllDocuments();
};
doTest(action);
}
public void testRenamePackageStaticImportsToNestedClasses() {
final PerformAction action = (rootDir, rootAfter) -> {
final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(myProject);
@@ -86,7 +86,7 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor
mySearchInNonJavaFiles = searchInNonJavaFiles;
myMoveCallback = moveCallback;
myFilesToMove = new HashMap<>();
myNestedDirsToMove = new HashMap<>();
myNestedDirsToMove = new LinkedHashMap<>();
for (PsiDirectory dir : directories) {
collectFiles2Move(myFilesToMove, myNestedDirsToMove, dir, includeSelf ? dir.getParentDirectory() : dir, getTargetDirectory(dir));
}
@@ -195,12 +195,17 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor
helper.postProcessUsages(usages, dir -> getResultDirectory(dir).findOrCreateTargetDirectory());
}
for (PsiDirectory directory : myDirectories) {
final TargetDirectoryWrapper wrapper = myNestedDirsToMove.get(directory);
final PsiDirectory targetDirectory = wrapper.getTargetDirectory();
if (targetDirectory == null || !PsiTreeUtil.isAncestor(directory, targetDirectory, false)) {
if (!isUsedInTarget(directory)) {
directory.delete();
}
}
for (PsiDirectory directory : myNestedDirsToMove.keySet()) {
if (directory.isValid() && directory.getChildren().length == 0) {
directory.delete();
}
}
}
catch (IncorrectOperationException e) {
myNonCodeUsages = new NonCodeUsageInfo[0];
@@ -208,6 +213,20 @@ public class MoveDirectoryWithClassesProcessor extends BaseRefactoringProcessor
}
}
private boolean isUsedInTarget(PsiDirectory directory) {
PsiDirectory targetDirectory = myNestedDirsToMove.get(directory).getTargetDirectory();
//don't delete super directory if move was performed inside subpackage
if (targetDirectory != null && PsiTreeUtil.isAncestor(directory, targetDirectory, false)) {
return true;
}
//don't delete subdirectory: something could be moved in there
if (PsiTreeUtil.isAncestor(targetDirectory, directory, false)) {
return true;
}
return false;
}
@Nullable
@Override
protected String getRefactoringId() {