diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java index 2ec39e07542c..aece13de0764 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java @@ -149,9 +149,10 @@ public class RefactoringConflictsUtil { PsiReferenceExpression refExpr = (PsiReferenceExpression)scope; PsiElement refElement = refExpr.resolve(); if (refElement instanceof PsiMember) { - if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false)) { - PsiExpression qualifier = refExpr.getQualifierExpression(); - PsiClass accessClass = (PsiClass)(qualifier != null ? PsiUtil.getAccessObjectClass(qualifier).getElement() : null); + PsiExpression qualifier = refExpr.getQualifierExpression(); + PsiClass accessClass = (PsiClass)(qualifier != null ? PsiUtil.getAccessObjectClass(qualifier).getElement() : null); + if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false) && + (accessClass == null || !RefactoringHierarchyUtil.willBeInTargetClass(accessClass, moving, targetClass, false))) { checkAccessibility((PsiMember)refElement, context, accessClass, member, conflicts); } } diff --git a/java/java-tests/testData/refactoring/pullUp/PublicMethodFromPrivateClassConflict.java b/java/java-tests/testData/refactoring/pullUp/PublicMethodFromPrivateClassConflict.java new file mode 100644 index 000000000000..a028329a4693 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/PublicMethodFromPrivateClassConflict.java @@ -0,0 +1,9 @@ +import java.util.*; +class A {} +class B extends A { + void foo() { + HM hm = new HM<>(); + for (Map.Entry stringStringEntry : hm.entrySet()) {} + } + private static class HM extends HashMap{} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/PublicMethodFromPrivateClassConflict_after.java b/java/java-tests/testData/refactoring/pullUp/PublicMethodFromPrivateClassConflict_after.java new file mode 100644 index 000000000000..96932a3c1923 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/PublicMethodFromPrivateClassConflict_after.java @@ -0,0 +1,11 @@ +import java.util.*; +class A { + void foo() { + HM hm = new HM<>(); + for (Map.Entry stringStringEntry : hm.entrySet()) {} + } + + private static class HM extends HashMap{} +} +class B extends A { +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java index aa539bd4d801..cbf095578213 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java @@ -147,6 +147,10 @@ public class PullUpTest extends LightRefactoringTestCase { doTest(false, new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class)); } + public void testPublicMethodFromPrivateClassConflict() { + doTest(false, new RefactoringTestUtil.MemberDescriptor("HM", PsiClass.class), new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class)); + } + private void doTest(RefactoringTestUtil.MemberDescriptor... membersToFind) { doTest(true, membersToFind); }