From 507d46e1147bb1d8c1f0946313108d84623bb285 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 18 Nov 2010 19:52:04 +0300 Subject: [PATCH] rename: do not conflict if class type parameter and type param defined inside class in static context (IDEA-57427) --- .../refactoring/rename/RenameJavaClassProcessor.java | 11 +++++++++++ .../RenameStaticMethodTypeParameter.java | 7 +++++++ .../RenameStaticMethodTypeParameter.java.after | 7 +++++++ .../intellij/refactoring/RenameCollisionsTest.java | 4 ++++ 4 files changed, 29 insertions(+) create mode 100644 java/java-tests/testData/refactoring/renameCollisions/RenameStaticMethodTypeParameter.java create mode 100644 java/java-tests/testData/refactoring/renameCollisions/RenameStaticMethodTypeParameter.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 9115514001c5..6a9330284ab3 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaClassProcessor.java @@ -26,6 +26,7 @@ import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.ClassUtil; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.RefactoringBundle; @@ -33,6 +34,7 @@ import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.util.MoveRenameUsageInfo; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; @@ -176,6 +178,15 @@ public class RenameJavaClassProcessor extends RenamePsiElementProcessor { final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(referenceElement.getProject()).getResolveHelper(); final PsiClass aClass = resolveHelper.resolveReferencedClass(newName, referenceElement); if (aClass == null) return; + if (aClass instanceof PsiTypeParameter && myRenamedClass instanceof PsiTypeParameter) { + 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 (member.hasModifierProperty(PsiModifier.STATIC)) return; + } + } + } final PsiFile containingFile = referenceElement.getContainingFile(); final String text = referenceElement.getText(); if (Comparing.equal(myRenamedClassQualifiedName, removeSpaces(text))) return; diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameStaticMethodTypeParameter.java b/java/java-tests/testData/refactoring/renameCollisions/RenameStaticMethodTypeParameter.java new file mode 100644 index 000000000000..f4f4c21e0be5 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameStaticMethodTypeParameter.java @@ -0,0 +1,7 @@ +public class Holder { + private final E elem; + + private Holder(E elem) { this.elem = elem; } + + public static <X> Holder of(X elem) { return new Holder(elem); } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameStaticMethodTypeParameter.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameStaticMethodTypeParameter.java.after new file mode 100644 index 000000000000..f0b4f81ce328 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameStaticMethodTypeParameter.java.after @@ -0,0 +1,7 @@ +public class Holder { + private final E elem; + + private Holder(E elem) { this.elem = elem; } + + public static Holder of(E elem) { return new Holder(elem); } +} \ 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 b3024ee49b8a..bfd33dd79548 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java @@ -169,6 +169,10 @@ public class RenameCollisionsTest extends LightCodeInsightTestCase { doTest("C"); } + public void testRenameStaticMethodTypeParameter() throws Exception { + doTest("E"); + } + private void doTest(final String newName) throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java"); PsiElement element = TargetElementUtilBase