From cda0ea978313610c277964c412ff04a2b8a916c4 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 25 Oct 2013 13:42:57 +0200 Subject: [PATCH] resolve conflict on type param rename (IDEA-57326) --- .../rename/RenameJavaClassProcessor.java | 34 ++++++++++++++----- .../RenameTypeParamToSuper.java | 12 +++++++ .../RenameTypeParamToSuper.java.after | 12 +++++++ .../refactoring/RenameCollisionsTest.java | 4 +++ 4 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/refactoring/renameCollisions/RenameTypeParamToSuper.java create mode 100644 java/java-tests/testData/refactoring/renameCollisions/RenameTypeParamToSuper.java.after diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java index 8f8b7770beba..3a4526101285 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java @@ -38,7 +38,7 @@ import com.intellij.refactoring.util.MoveRenameUsageInfo; import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; -import com.intellij.util.ArrayUtil; +import com.intellij.util.ArrayUtilRt; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import com.intellij.util.containers.MultiMap; @@ -72,7 +72,11 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor { if (usage instanceof CollidingClassImportUsageInfo) { ((CollidingClassImportUsageInfo)usage).getImportStatement().delete(); } else if (usage instanceof MemberHidesOuterMemberUsageInfo) { - hidesOut.add((MemberHidesOuterMemberUsageInfo)usage); + final PsiElement usageElement = usage.getElement(); + final PsiJavaCodeReferenceElement collidingRef = (PsiJavaCodeReferenceElement)usageElement; + if (collidingRef != null) { + hidesOut.add(new MemberHidesOuterMemberUsageInfo(usageElement, (PsiClass)collidingRef.resolve())); + } } else { postponedCollisions.add(usage); @@ -105,13 +109,25 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor { collision.resolveCollision(); } - /*for (MemberHidesOuterMemberUsageInfo usage : hidesOut) { + for (MemberHidesOuterMemberUsageInfo usage : hidesOut) { PsiJavaCodeReferenceElement collidingRef = (PsiJavaCodeReferenceElement)usage.getElement(); - PsiReferenceExpression ref = RenameJavaMemberProcessor.createQualifiedMemberReference(aClass, collidingRef); - collidingRef.replace(ref); - }*/ - - + PsiMember member = (PsiMember)usage.getReferencedElement(); + if (collidingRef != null && collidingRef.isValid() && member != null && member.isValid()) { + final PsiManager manager = member.getManager(); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(member.getProject()); + final String name = member.getName(); + final PsiClass containingClass = member.getContainingClass(); + if (name != null && containingClass != null) { + if (manager.areElementsEquivalent(factory.createReferenceFromText(name, collidingRef).resolve(), member)) continue; + final PsiJavaCodeReferenceElement ref = factory.createReferenceFromText("A." + name, collidingRef); + final PsiJavaCodeReferenceElement qualifier = (PsiJavaCodeReferenceElement)ref.getQualifier(); + LOG.assertTrue(qualifier != null); + final PsiJavaCodeReferenceElement classReference = factory.createClassReferenceElement(containingClass); + qualifier.replace(classReference); + collidingRef.replace(ref); + } + } + } if (listener != null) { listener.elementRenamed(aClass); } @@ -252,7 +268,7 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor { final PsiTypeParameterListOwner member = PsiTreeUtil.getParentOfType(referenceElement, PsiTypeParameterListOwner.class); if (member != null) { final PsiTypeParameterList typeParameterList = member.getTypeParameterList(); - if (typeParameterList != null && ArrayUtil.find(typeParameterList.getTypeParameters(), myRenamedClass) > -1) { + if (typeParameterList != null && ArrayUtilRt.find(typeParameterList.getTypeParameters(), myRenamedClass) > -1) { if (member.hasModifierProperty(PsiModifier.STATIC)) return; } } diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameTypeParamToSuper.java b/java/java-tests/testData/refactoring/renameCollisions/RenameTypeParamToSuper.java new file mode 100644 index 000000000000..7ceac6ca37a2 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameTypeParamToSuper.java @@ -0,0 +1,12 @@ +abstract class A{ + class T{} + abstract T foo(); +} +class B<S> extends A{ + void foo(T x){} + + @Override + T foo() { + return null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameTypeParamToSuper.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameTypeParamToSuper.java.after new file mode 100644 index 000000000000..b7e194168e6c --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameTypeParamToSuper.java.after @@ -0,0 +1,12 @@ +abstract class A{ + class T{} + abstract T foo(); +} +class B extends A{ + void foo(A.T x){} + + @Override + A.T foo() { + return null; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java index 9bc767a40ccb..e09c448319a9 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java @@ -217,6 +217,10 @@ public class RenameCollisionsTest extends LightRefactoringTestCase { doTest("gg"); } + public void testRenameTypeParamToSuper() throws Exception { + doTest("T"); + } + private void doTest(final String newName) throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java"); PsiElement element = TargetElementUtilBase