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 b22621c1d9bb..856259c15e87 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java @@ -160,7 +160,8 @@ public class RefactoringConflictsUtil { PsiElement refElement = refExpr.resolve(); if (refElement instanceof PsiMember) { PsiExpression qualifier = refExpr.getQualifierExpression(); - PsiClass qualifierAccessClass = (PsiClass)(qualifier != null && !(qualifier instanceof PsiSuperExpression) ? PsiUtil.getAccessObjectClass(qualifier).getElement() : accessClass); + PsiClass qualifierAccessClass = (PsiClass)(qualifier != null && !(qualifier instanceof PsiSuperExpression) ? PsiUtil.getAccessObjectClass(qualifier).getElement() + : accessClass != null && PsiTreeUtil.isAncestor(((PsiMember)refElement).getContainingClass(), accessClass, true) ? null : accessClass); if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false) && (qualifierAccessClass == null || !RefactoringHierarchyUtil.willBeInTargetClass(qualifierAccessClass, moving, targetClass, false))) { checkAccessibility((PsiMember)refElement, context, qualifierAccessClass, member, conflicts); diff --git a/java/java-tests/testData/refactoring/pushDown/PrivateFieldUsedFromMovedAnonymous.java b/java/java-tests/testData/refactoring/pushDown/PrivateFieldUsedFromMovedAnonymous.java new file mode 100644 index 000000000000..d44204a85da0 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/PrivateFieldUsedFromMovedAnonymous.java @@ -0,0 +1,15 @@ + +class A { + private String prefix = "> "; + + void foo() { + Runnable runnable = new Runnable() { + @Override + public void run() { + System.out.println(prefix); + } + }; + } +} + +class B extends A {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pushDown/PrivateFieldUsedFromMovedAnonymous_after.java b/java/java-tests/testData/refactoring/pushDown/PrivateFieldUsedFromMovedAnonymous_after.java new file mode 100644 index 000000000000..d4b6734e93bc --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/PrivateFieldUsedFromMovedAnonymous_after.java @@ -0,0 +1,16 @@ + +class A { + private String prefix = "> "; + +} + +class B extends A { + void foo() { + Runnable runnable = new Runnable() { + @Override + public void run() { + System.out.println(prefix); + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/PullUpMultifileTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/PullUpMultifileTest.java index 90b580b9184f..a747ea96ac53 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/PullUpMultifileTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/PullUpMultifileTest.java @@ -89,7 +89,8 @@ public class PullUpMultifileTest extends MultiFileTestCase { } public void testAccessibleViaInheritanceInsideAnonymousClass() { - doTest("Method method2Move() uses method A.bar(), which is not accessible from the superclass"); + doTest("Method method2Move() uses method A.bar(), which is not accessible from the superclass", + "Method A.bar() is protected and will not be accessible from method method2Move()."); } public void testReuseSuperMethod() { diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java index c9ebc2f751a3..e734e2d5ce66 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java @@ -46,6 +46,7 @@ public class PushDownTest extends LightRefactoringTestCase { public void testFieldAndStaticReferencedClass() { doTest(); } public void testThisRefInAnonymous() { doTest(); } public void testSuperOverHierarchyConflict() { doTest(true); } + public void testPrivateFieldUsedFromMovedAnonymous() { doTest(true); } public void testSuperOverHierarchy() { doTest(); } public void testMethodTypeParametersList() { doTest(); } public void testMethodFromInterfaceToAbstractClass() { doTest(); }