diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownDelegate.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownDelegate.java index 6b63c4da8932..40b06857a51a 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownDelegate.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/JavaPushDownDelegate.java @@ -30,18 +30,21 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.javadoc.PsiDocComment; +import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.FunctionalExpressionSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.*; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.classMembers.MemberInfoBase; +import com.intellij.refactoring.inline.InlineMethodProcessor; import com.intellij.refactoring.listeners.JavaRefactoringListenerManager; import com.intellij.refactoring.listeners.impl.JavaRefactoringListenerManagerImpl; import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -300,6 +303,7 @@ public class JavaPushDownDelegate extends PushDownDelegate memberInfo, PsiMethod methodBySignature) { + PsiMethod superMethod = (PsiMethod)memberInfo.getMember(); + Collection superReferences = + ReferencesSearch.search(superMethod, new LocalSearchScope(methodBySignature)).findAll(); + if (superReferences.size() == 1) { + PsiReference reference = ContainerUtil.getFirstItem(superReferences); + if (reference == null) return; + PsiElement element = reference.getElement(); + if (element instanceof PsiReferenceExpression) { + PsiReferenceExpression referenceExpression = (PsiReferenceExpression)element; + new InlineMethodProcessor(element.getProject(), superMethod, referenceExpression, null, true) + .inlineMethodCall(referenceExpression); + } + } + } + @Override public void removeFromSourceClass(PushDownData pushDownData) { for (MemberInfoBase memberInfo : pushDownData.getMembersToMove()) { 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 525149f3fdd8..6a3736b53b4c 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java @@ -18,6 +18,7 @@ package com.intellij.refactoring.memberPushDown; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; +import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.MethodSignatureUtil; @@ -150,6 +151,7 @@ public class PushDownConflicts { if (myConflicts.containsKey(element)) continue; final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)element; final PsiExpression qualifier = referenceExpression.getQualifierExpression(); + if (qualifier instanceof PsiSuperExpression) continue; if (qualifier != null) { final PsiType qualifierType = qualifier.getType(); PsiClass aClass = null; @@ -192,7 +194,7 @@ public class PushDownConflicts { if (!modifierList.hasModifierProperty(PsiModifier.ABSTRACT)) { PsiMethod method = (PsiMethod)movedMember; final PsiMethod overrider = MethodSignatureUtil.findMethodBySuperMethod(targetClass, method, false); - if (overrider != null) { + if (overrider != null && ReferencesSearch.search(method, new LocalSearchScope(overrider)).findAll().size() != 1) { String message = RefactoringBundle.message("0.is.already.overridden.in.1", RefactoringUIUtil.getDescription(method, true), RefactoringUIUtil.getDescription(targetClass, false)); myConflicts.putValue(overrider, CommonRefactoringUtil.capitalize(message)); diff --git a/java/java-tests/testData/refactoring/pushDown/InlineSuperMethodCall.java b/java/java-tests/testData/refactoring/pushDown/InlineSuperMethodCall.java new file mode 100644 index 000000000000..186c07e346c5 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/InlineSuperMethodCall.java @@ -0,0 +1,16 @@ +class Test { + void foo(final boolean d) { + if (d) { + foo(false); + } + System.out.println(); + + } +} + +class Test2 extends Test { + @Override + void foo(final boolean d) { + super.foo(d); + } +} diff --git a/java/java-tests/testData/refactoring/pushDown/InlineSuperMethodCall_after.java b/java/java-tests/testData/refactoring/pushDown/InlineSuperMethodCall_after.java new file mode 100644 index 000000000000..c08e38d2f001 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/InlineSuperMethodCall_after.java @@ -0,0 +1,12 @@ +class Test { +} + +class Test2 extends Test { + void foo(final boolean d) { + if (d) { + foo(false); + } + System.out.println(); + + } +} 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 90d22b53124a..494e5e6eea38 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/PushDownTest.java @@ -18,6 +18,7 @@ package com.intellij.java.refactoring; import com.intellij.codeInsight.TargetElementUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.memberPushDown.PushDownProcessor; import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; @@ -66,6 +67,7 @@ public class PushDownTest extends LightRefactoringTestCase { public void testFunctionalExpression() { doTest(true);} public void testFunctionalInterface() { doTest(true);} public void testFunctionalExpressionDefaultMethod() { doTest();} + public void testInlineSuperMethodCall() { BaseRefactoringProcessor.ConflictsInTestsException.withIgnoredConflicts(() -> doTest(true));} public void testRenameTypeParametersToAvoidHiding() { doTest();} public void testNoRenameTypeParametersToAvoidHidingForStatic() { doTest();}