diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java index 63f28bc88c72..f0d149f9730b 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java @@ -21,6 +21,7 @@ import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.MethodSignatureUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.RefactoringConflictsUtil; @@ -203,6 +204,12 @@ public class PushDownConflicts { } } } + + if (movedMember.hasModifierProperty(PsiModifier.STATIC) && + PsiUtil.getEnclosingStaticElement(targetClass, null) == null && + !(targetClass.getParent() instanceof PsiFile)) { + myConflicts.putValue(movedMember, "Static " + RefactoringUIUtil.getDescription(movedMember, false) + " can't be pushed to non-static " + RefactoringUIUtil.getDescription(targetClass, false)); + } } private class UsedMovedMembersConflictsCollector extends ClassMemberReferencesVisitor { diff --git a/java/java-tests/testData/refactoring/pushDown/StaticToLocal.java b/java/java-tests/testData/refactoring/pushDown/StaticToLocal.java new file mode 100644 index 000000000000..72d141a821c5 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/StaticToLocal.java @@ -0,0 +1,9 @@ +class Foo { + public static void foo() { + + } + + void m() { + class FooExt extends Foo { } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pushDown/StaticToLocal_after.java b/java/java-tests/testData/refactoring/pushDown/StaticToLocal_after.java new file mode 100644 index 000000000000..72d141a821c5 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/StaticToLocal_after.java @@ -0,0 +1,9 @@ +class Foo { + public static void foo() { + + } + + void m() { + class FooExt extends Foo { } + } +} \ No newline at end of file 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 2547994c34ff..fc8a9790eada 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java @@ -121,6 +121,12 @@ public class PushDownTest extends LightRefactoringTestCase { }); } + public void testStaticToLocal() { + doTest(conflicts -> { + assertSameElements(conflicts.values(), Collections.singletonList("Static method foo() can't be pushed to non-static class FooExt")); + }); + } + private void doTest() { doTest(false); }