diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java index 628618ccc852..4d86529bd7b7 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java @@ -28,10 +28,7 @@ import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.OverridingMethodsSearch; -import com.intellij.psi.util.MethodSignature; -import com.intellij.psi.util.MethodSignatureUtil; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.psi.util.*; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.RefactoringBundle; @@ -158,7 +155,8 @@ public class RenameJavaMethodProcessor extends RenameJavaMemberProcessor { if (!methodAndOverriders.contains(actualMethod)) { PsiClass outerClass = PsiTreeUtil.getParentOfType(element, PsiClass.class); while (outerClass != null) { - if (containingClasses.contains(outerClass)) { + PsiClass finalOuterClass = outerClass; + if (containingClasses.stream().anyMatch(psiClass -> InheritanceUtil.isInheritorOrSelf(finalOuterClass, psiClass, true))) { qualifyMember(element, newName, outerClass, isStatic); break; } diff --git a/java/java-tests/testData/refactoring/renameCollisions/InnerClassNameCollisionWithSuperClassOfContainer.java b/java/java-tests/testData/refactoring/renameCollisions/InnerClassNameCollisionWithSuperClassOfContainer.java new file mode 100644 index 000000000000..390fcdd98297 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/InnerClassNameCollisionWithSuperClassOfContainer.java @@ -0,0 +1,17 @@ + +interface ITest { + void action(Object o); +} + + +class Test implements ITest{ + + public void action(Object o) { + } + + private class ActionHandler { + public void handleAction(Object o, Object o1) { + action(o); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameCollisions/InnerClassNameCollisionWithSuperClassOfContainer.java.after b/java/java-tests/testData/refactoring/renameCollisions/InnerClassNameCollisionWithSuperClassOfContainer.java.after new file mode 100644 index 000000000000..5d9ce6f3924e --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/InnerClassNameCollisionWithSuperClassOfContainer.java.after @@ -0,0 +1,17 @@ + +interface ITest { + void handleAction(Object o); +} + + +class Test implements ITest{ + + public void handleAction(Object o) { + } + + private class ActionHandler { + public void handleAction(Object o, Object o1) { + Test.this.handleAction(o); + } + } +} \ 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 c7d5e16b8373..2b4ca24700f2 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java @@ -242,6 +242,10 @@ public class RenameCollisionsTest extends LightRefactoringTestCase { doTest("T"); } + public void testInnerClassNameCollisionWithSuperClassOfContainer() throws Exception { + doTest("handleAction"); + } + private void doTestImpossibleToRename() throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java"); PsiElement element = TargetElementUtil