diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java index 90fec1b8d5a1..3daa17d0ea5b 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java @@ -356,11 +356,14 @@ public class PushDownProcessor extends BaseRefactoringProcessor { } else if (member instanceof PsiMethod) { PsiMethod method = (PsiMethod)member; - final PsiMethod methodBySignature = targetClass.findMethodBySignature(method, false); if (methodBySignature == null) { + final boolean wasInterface = myClass.isInterface(); newMember = (PsiMethod)targetClass.add(method); - if (memberInfo.isToAbstract()) { + if (wasInterface) { + PsiUtil.setModifierProperty(newMember, PsiModifier.ABSTRACT, true); + PsiUtil.setModifierProperty(newMember, PsiModifier.PUBLIC, true); + } else if (memberInfo.isToAbstract()) { if (newMember.hasModifierProperty(PsiModifier.PRIVATE)) { PsiUtil.setModifierProperty(newMember, PsiModifier.PROTECTED, true); } diff --git a/java/java-tests/testData/refactoring/pushDown/MethodFromInterfaceToAbstractClass.java b/java/java-tests/testData/refactoring/pushDown/MethodFromInterfaceToAbstractClass.java new file mode 100644 index 000000000000..d860383500e5 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/MethodFromInterfaceToAbstractClass.java @@ -0,0 +1,7 @@ +abstract class StraightLine implements Inline { +} + +interface Inline { + + void go(); // inline this method +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pushDown/MethodFromInterfaceToAbstractClass.java.after b/java/java-tests/testData/refactoring/pushDown/MethodFromInterfaceToAbstractClass.java.after new file mode 100644 index 000000000000..d7aa98fc943a --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/MethodFromInterfaceToAbstractClass.java.after @@ -0,0 +1,7 @@ +abstract class StraightLine implements Inline { + public abstract void go(); // inline this method +} + +interface Inline { + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java index b10d2ab46b3d..54fb2b7b3535 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java @@ -111,6 +111,10 @@ public class PushDownTest extends LightRefactoringTestCase { doTest(); } + public void testMethodFromInterfaceToAbstractClass() throws Exception { + doTest(); + } + public void testSameClassInterface() throws Exception { final String filePath = "/refactoring/pushDown/" + getTestName(false) + ".java"; configureByFile(filePath);