From 1a18c8df4c661bb136e23177771ce42d386d9289 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 20 Feb 2020 20:52:10 +0100 Subject: [PATCH] less magic on copy method from interface (IDEA-233351) GitOrigin-RevId: b3196a93a6d4857fcba722e271b71d85d8567094 --- .../intellij/psi/impl/source/tree/JavaTreeCopyHandler.java | 3 ++- .../InheritanceToDelegationProcessor.java | 5 +++++ .../copyClass/privateMethodsInInterfaces/Bar.expected.java | 4 ++++ .../copyClass/privateMethodsInInterfaces/Foo.java | 4 ++++ .../testSrc/com/intellij/java/refactoring/CopyClassTest.java | 4 ++++ 5 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/copyClass/privateMethodsInInterfaces/Bar.expected.java create mode 100644 java/java-tests/testData/refactoring/copyClass/privateMethodsInInterfaces/Foo.java diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaTreeCopyHandler.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaTreeCopyHandler.java index 3c4d2b359960..c1185aee72aa 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaTreeCopyHandler.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/JavaTreeCopyHandler.java @@ -28,6 +28,7 @@ import com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl; import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.templateLanguages.OuterLanguageElement; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import java.util.Map; @@ -103,7 +104,7 @@ public class JavaTreeCopyHandler implements TreeCopyHandler { modifierList.setModifierProperty(PsiModifier.STATIC, true); modifierList.setModifierProperty(PsiModifier.FINAL, true); } - else if (element.getTreeParent().getElementType() == JavaElementType.METHOD || + else if (element.getTreeParent().getElementType() == JavaElementType.METHOD && !PsiUtil.isLanguageLevel8OrHigher(modifierList) || element.getTreeParent().getElementType() == JavaElementType.ANNOTATION_METHOD) { modifierList.setModifierProperty(PsiModifier.PUBLIC, true); modifierList.setModifierProperty(PsiModifier.ABSTRACT, true); diff --git a/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java b/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java index fd58d734379a..00fa1c9cdf0a 100644 --- a/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java @@ -803,6 +803,11 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { String visibility = checkOuterClassAbstractMethod(signature); PsiMethod newOuterMethod = (PsiMethod)myClass.add(myMethod); PsiUtil.setModifierProperty(newOuterMethod, visibility, true); + if (containingClass.isInterface() && + !innerClass.isInterface() && + myMethod.getBody() == null) { + PsiUtil.setModifierProperty(newOuterMethod, PsiModifier.ABSTRACT, true); + } final PsiDocComment docComment = newOuterMethod.getDocComment(); if (docComment != null) { docComment.delete(); diff --git a/java/java-tests/testData/refactoring/copyClass/privateMethodsInInterfaces/Bar.expected.java b/java/java-tests/testData/refactoring/copyClass/privateMethodsInInterfaces/Bar.expected.java new file mode 100644 index 000000000000..e67bfa325b2b --- /dev/null +++ b/java/java-tests/testData/refactoring/copyClass/privateMethodsInInterfaces/Bar.expected.java @@ -0,0 +1,4 @@ +public interface Bar { + private void foo() {} + static void bar() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/copyClass/privateMethodsInInterfaces/Foo.java b/java/java-tests/testData/refactoring/copyClass/privateMethodsInInterfaces/Foo.java new file mode 100644 index 000000000000..d5d88af29833 --- /dev/null +++ b/java/java-tests/testData/refactoring/copyClass/privateMethodsInInterfaces/Foo.java @@ -0,0 +1,4 @@ +public interface Foo { + private void foo() {} + static void bar() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/CopyClassTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/CopyClassTest.java index b5ae2a752dfc..c5bfabffd5b3 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/CopyClassTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/CopyClassTest.java @@ -28,6 +28,10 @@ public class CopyClassTest extends LightMultiFileTestCase { public void testReplaceAllOccurrences() throws Exception { doTest("Foo", "Bar"); } + + public void testPrivateMethodsInInterfaces() throws Exception { + doTest("Foo", "Bar"); + } public void testReplaceAllOccurrences1() throws Exception { doTest("Foo", "Bar");