From d34e5994185f32bb07bfd76d8914051187468e9b Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 8 May 2024 15:37:51 +0200 Subject: [PATCH] [java-refactoring] IDEA-350228 Missing method body after moving an instance method from interface to non-abstract class GitOrigin-RevId: a54261f44b8e07273962d3c8c6c2a3db62d6fccf --- .../MoveInstanceMethodProcessor.java | 6 ++++++ .../moveInstanceMethod/InterfaceMethodIntoClass.java | 11 +++++++++++ .../InterfaceMethodIntoClass.java.after | 12 ++++++++++++ .../moveMethod/MoveInstanceMethodTest.java | 4 ++++ 4 files changed, 33 insertions(+) create mode 100644 java/java-tests/testData/refactoring/moveInstanceMethod/InterfaceMethodIntoClass.java create mode 100644 java/java-tests/testData/refactoring/moveInstanceMethod/InterfaceMethodIntoClass.java.after diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java index 481122770d86..f970b9fb928b 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodProcessor.java @@ -2,6 +2,7 @@ package com.intellij.refactoring.move.moveInstanceMethod; import com.intellij.codeInsight.ChangeContextUtil; +import com.intellij.codeInsight.daemon.impl.quickfix.CreateFromUsageUtils; import com.intellij.codeInsight.generation.OverrideImplementUtil; import com.intellij.ide.util.EditorHelper; import com.intellij.java.refactoring.JavaRefactoringBundle; @@ -460,6 +461,11 @@ public class MoveInstanceMethodProcessor extends BaseRefactoringProcessor{ final PsiCodeBlock body = myMethod.getBody(); if (body != null) { replaceReferences(body); + } else { + if (myMethod.hasModifierProperty(PsiModifier.ABSTRACT) && + !myTargetClass.isInterface() && !myTargetClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + CreateFromUsageUtils.setupMethodBody(myMethod); + } } final PsiMethod methodCopy = getPatternMethod(); diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/InterfaceMethodIntoClass.java b/java/java-tests/testData/refactoring/moveInstanceMethod/InterfaceMethodIntoClass.java new file mode 100644 index 000000000000..4e7373fcda4e --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInstanceMethod/InterfaceMethodIntoClass.java @@ -0,0 +1,11 @@ + +public interface A { + + public void n(A a); + + public void m(B b); +} + +class B { + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/InterfaceMethodIntoClass.java.after b/java/java-tests/testData/refactoring/moveInstanceMethod/InterfaceMethodIntoClass.java.after new file mode 100644 index 000000000000..449992e1bdac --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInstanceMethod/InterfaceMethodIntoClass.java.after @@ -0,0 +1,12 @@ + +public interface A { + + public void n(A a); + +} + +class B { + + public void m() { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/moveMethod/MoveInstanceMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/moveMethod/MoveInstanceMethodTest.java index 8247ea409f3b..41f4855e5637 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/moveMethod/MoveInstanceMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/moveMethod/MoveInstanceMethodTest.java @@ -104,6 +104,10 @@ public class MoveInstanceMethodTest extends LightRefactoringTestCase { public void testUsageInAnonymousClass() { doTest(true, 0); } + + public void testInterfaceMethodIntoClass() { + doTest(true, 0); + } public void testConflictingLocalVariableAndTargetClassField() { doTest(true, 0);