diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java index 39913cdf2a60..ab86ee853b3b 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/JavaPullUpHelper.java @@ -219,7 +219,10 @@ public class JavaPullUpHelper implements PullUpHelper { } } PsiMethod methodCopy = (PsiMethod)method.copy(); - if (method.findSuperMethods(myTargetSuperClass).length == 0) { + Language language = myTargetSuperClass.getLanguage(); + final PsiMethod superClassMethod = myTargetSuperClass.findMethodBySignature(methodCopy, false); + if (superClassMethod != null && superClassMethod.findDeepestSuperMethods().length == 0 || + method.findSuperMethods(myTargetSuperClass).length == 0) { deleteOverrideAnnotationIfFound(methodCopy); } boolean isOriginalMethodAbstract = method.hasModifierProperty(PsiModifier.ABSTRACT) || method.hasModifierProperty(PsiModifier.DEFAULT); @@ -238,7 +241,14 @@ public class JavaPullUpHelper implements PullUpHelper { myJavaDocPolicy.processCopiedJavaDoc(methodCopy.getDocComment(), method.getDocComment(), isOriginalMethodAbstract); - final PsiMember movedElement = anchor != null ? (PsiMember)myTargetSuperClass.addBefore(methodCopy, anchor) : (PsiMember)myTargetSuperClass.add(methodCopy); + final PsiMember movedElement; + if (superClassMethod != null && superClassMethod.hasModifierProperty(PsiModifier.ABSTRACT)) { + movedElement = (PsiMember)superClassMethod.replace(convertMethodToLanguage(methodCopy, language)); + } + else { + movedElement = + anchor != null ? (PsiMember)myTargetSuperClass.addBefore(methodCopy, anchor) : (PsiMember)myTargetSuperClass.add(methodCopy); + } CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(method.getProject()); if (styleSettings.INSERT_OVERRIDE_ANNOTATION) { if (PsiUtil.isLanguageLevel5OrHigher(mySourceClass) && !myIsTargetInterface || PsiUtil.isLanguageLevel6OrHigher(mySourceClass)) { @@ -265,8 +275,6 @@ public class JavaPullUpHelper implements PullUpHelper { RefactoringUtil.replaceMovedMemberTypeParameters(methodCopy, PsiUtil.typeParametersIterable(mySourceClass), substitutor, elementFactory); fixReferencesToStatic(methodCopy); - Language language = myTargetSuperClass.getLanguage(); - final PsiMethod superClassMethod = myTargetSuperClass.findMethodBySignature(methodCopy, false); if (superClassMethod != null && superClassMethod.hasModifierProperty(PsiModifier.ABSTRACT)) { superClassMethod.replace(convertMethodToLanguage(methodCopy, language)); } diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java index b92c5f52bfa9..3fd4e334a01f 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpDialog.java @@ -196,7 +196,7 @@ public class PullUpDialog extends PullUpDialogBaseoo() { + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract_after.java b/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract_after.java new file mode 100644 index 000000000000..2a1b9f1ace61 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/AsDefaultMethodOverAbstract_after.java @@ -0,0 +1,12 @@ +class Test { + interface Printer { + void foo(); + + } + + abstract class AbstractPrinter implements Printer { + @Override + public void foo() { + } + } +} \ 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 f0d4e771ed1a..665afec47ec9 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java @@ -163,6 +163,9 @@ public class PullUpTest extends LightRefactoringTestCase { public void testPreserveOverride() { doTest(false, new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class)); } + public void testAsDefaultMethodOverAbstract() { + doTest(false, "Class Test.Printer already contains a method foo()", new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class)); + } public void testPublicMethodFromPrivateClassConflict() { doTest(false, new RefactoringTestUtil.MemberDescriptor("HM", PsiClass.class), new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class));