From 2e8060a53bc3eb599c28c1889ecdaf49870772ac Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 12 Jul 2011 16:28:11 +0400 Subject: [PATCH] rename package: do not replace dir with corresponding package when package was already processed move classes from dir: update file refs --- .../rename/RenamePsiDirectoryProcessor.java | 4 -- .../after/src1/pack2/UsagesFromBoth.java | 9 +++ .../xmlDirRefs/after/src1/target/empty.txt | 0 .../after/src1/target/pack1/S1.java | 3 + .../xmlDirRefs/after/src2/pack1/S2.java | 3 + .../after/src2/pack2/UsagesFromBoth2.java | 9 +++ .../xmlDirRefs/after/src2/pack2/u.xml | 3 + .../xmlDirRefs/before/src1/pack1/S1.java | 3 + .../before/src1/pack2/UsagesFromBoth.java | 8 +++ .../xmlDirRefs/before/src1/target/empty.txt | 0 .../xmlDirRefs/before/src2/pack1/S2.java | 3 + .../before/src2/pack2/UsagesFromBoth2.java | 8 +++ .../xmlDirRefs/before/src2/pack2/u.xml | 3 + .../MovePackageAsDirectoryTest.java | 4 ++ .../MoveDirectoryWithClassesHelper.java | 55 +++++++++++++++++-- 15 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/pack2/UsagesFromBoth.java create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/target/empty.txt create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/target/pack1/S1.java create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack1/S2.java create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack2/UsagesFromBoth2.java create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack2/u.xml create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/pack1/S1.java create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/pack2/UsagesFromBoth.java create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/target/empty.txt create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack1/S2.java create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack2/UsagesFromBoth2.java create mode 100644 java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack2/u.xml diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenamePsiDirectoryProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenamePsiDirectoryProcessor.java index da8525c43470..54cdbb3c7b6b 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenamePsiDirectoryProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenamePsiDirectoryProcessor.java @@ -68,10 +68,6 @@ public class RenamePsiDirectoryProcessor extends RenamePsiElementProcessor { @NotNull @Override public Collection findReferences(PsiElement element) { - final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage((PsiDirectory) element); - if (aPackage != null) { - return ReferencesSearch.search(aPackage, element.getUseScope()).findAll(); - } return ReferencesSearch.search(element).findAll(); } diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/pack2/UsagesFromBoth.java b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/pack2/UsagesFromBoth.java new file mode 100644 index 000000000000..6d4410fd6ae6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/pack2/UsagesFromBoth.java @@ -0,0 +1,9 @@ +package pack2; + +import pack1.*; +import target.pack1.S1; + +public class UsagesFromBoth { + S1 s1; + S2 s2; +} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/target/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/target/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/target/pack1/S1.java b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/target/pack1/S1.java new file mode 100644 index 000000000000..bafd60dc4fa1 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src1/target/pack1/S1.java @@ -0,0 +1,3 @@ +package target.pack1; + +public class S1{} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack1/S2.java b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack1/S2.java new file mode 100644 index 000000000000..0bd2d2024dc6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack1/S2.java @@ -0,0 +1,3 @@ +package pack1; + +public class S2{} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack2/UsagesFromBoth2.java b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack2/UsagesFromBoth2.java new file mode 100644 index 000000000000..9b53f3854379 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack2/UsagesFromBoth2.java @@ -0,0 +1,9 @@ +package pack2; + +import pack1.*; +import target.pack1.S1; + +public class UsagesFromBoth2 { + S1 s1; + S2 s2; +} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack2/u.xml b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack2/u.xml new file mode 100644 index 000000000000..be82fb7a19b6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/after/src2/pack2/u.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/pack1/S1.java b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/pack1/S1.java new file mode 100644 index 000000000000..c0a5f31dbfba --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/pack1/S1.java @@ -0,0 +1,3 @@ +package pack1; + +public class S1{} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/pack2/UsagesFromBoth.java b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/pack2/UsagesFromBoth.java new file mode 100644 index 000000000000..906b1fe953d6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/pack2/UsagesFromBoth.java @@ -0,0 +1,8 @@ +package pack2; + +import pack1.*; + +public class UsagesFromBoth { + S1 s1; + S2 s2; +} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/target/empty.txt b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src1/target/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack1/S2.java b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack1/S2.java new file mode 100644 index 000000000000..0bd2d2024dc6 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack1/S2.java @@ -0,0 +1,3 @@ +package pack1; + +public class S2{} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack2/UsagesFromBoth2.java b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack2/UsagesFromBoth2.java new file mode 100644 index 000000000000..d8ece1cab742 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack2/UsagesFromBoth2.java @@ -0,0 +1,8 @@ +package pack2; + +import pack1.*; + +public class UsagesFromBoth2 { + S1 s1; + S2 s2; +} diff --git a/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack2/u.xml b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack2/u.xml new file mode 100644 index 000000000000..47926cb29608 --- /dev/null +++ b/java/java-tests/testData/refactoring/movePackageAsDir/xmlDirRefs/before/src2/pack2/u.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java index 27c7258f1cf7..bcc7dd0c720b 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MovePackageAsDirectoryTest.java @@ -63,6 +63,10 @@ public class MovePackageAsDirectoryTest extends MultiFileTestCase { doTest(createAction("pack1", "target")); } + public void testXmlDirRefs() throws Exception { + doTest(createAction("pack1", "target")); + } + private PerformAction createAction(final String packageName, final String targetPackageName) { return new PerformAction() { @Override diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesHelper.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesHelper.java index 5e488d8e2aab..10747a7906fe 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesHelper.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveDirectoryWithClassesHelper.java @@ -3,13 +3,18 @@ package com.intellij.refactoring.move.moveClassesOrPackages; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.ProperTextRange; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler; import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil; import com.intellij.usageView.UsageInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.List; @@ -45,8 +50,29 @@ public abstract class MoveDirectoryWithClassesHelper { public static class Default extends MoveDirectoryWithClassesHelper { @Override - public void findUsages(Collection filesToMove, PsiDirectory[] directoriesToMove, Collection result, - boolean searchInComments, boolean searchInNonJavaFiles, Project project) { + public void findUsages(Collection filesToMove, + PsiDirectory[] directoriesToMove, + Collection result, + boolean searchInComments, + boolean searchInNonJavaFiles, + Project project) { + for (PsiFile file : filesToMove) { + for (PsiReference reference : ReferencesSearch.search(file)) { + result.add(new MyUsageInfo(reference, file)); + } + } + } + + @Override + public void postProcessUsages(UsageInfo[] usages) { + for (UsageInfo usage : usages) { + if (usage instanceof MyUsageInfo) { + PsiReference reference = usage.getReference(); + if (reference != null) { + reference.bindToElement(((MyUsageInfo)usage).myFile); + } + } + } } @Override @@ -71,10 +97,6 @@ public abstract class MoveDirectoryWithClassesHelper { return true; } - @Override - public void postProcessUsages(UsageInfo[] usages) { - } - @Override public void beforeMove(PsiFile psiFile) { } @@ -82,5 +104,26 @@ public abstract class MoveDirectoryWithClassesHelper { @Override public void afterMove(PsiElement newElement) { } + + private static class MyUsageInfo extends UsageInfo { + private final PsiFile myFile; + + public MyUsageInfo(@NotNull PsiReference reference, PsiFile file) { + super(reference); + myFile = file; + } + + @Nullable + public PsiReference getReference() { + PsiElement element = getElement(); + if (element == null) { + return null; + } + else { + final ProperTextRange rangeInElement = getRangeInElement(); + return rangeInElement != null ? element.findReferenceAt(rangeInElement.getStartOffset()) : element.getReference(); + } + } + } } }