mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 09:19:13 +07:00
rename package: ensure move targets are not deleted (IDEA-177845)
This commit is contained in:
+3
@@ -0,0 +1,3 @@
|
||||
package pack1.pack2;
|
||||
|
||||
public class S1{}
|
||||
+3
@@ -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);
|
||||
|
||||
+23
-4
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user