diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index ee09678ff7c9..c006b85ad128 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.inline; +import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.ChangeContextUtil; import com.intellij.history.LocalHistory; import com.intellij.history.LocalHistoryAction; @@ -39,6 +40,7 @@ import com.intellij.psi.impl.source.javadoc.PsiDocMethodOrFieldRef; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; @@ -135,6 +137,13 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { usages.add(new UsageInfo(reference.getElement())); } + OverridingMethodsSearch.search(myMethod).forEach(method -> { + if (AnnotationUtil.isAnnotated(method, Override.class.getName(), false)) { + usages.add(new UsageInfo(method)); + } + return true; + }); + if (mySearchInComments || mySearchForTextOccurrences) { final NonCodeUsageInfoFactory infoFactory = new NonCodeUsageInfoFactory(myMethod, myMethod.getName()) { @Override @@ -480,6 +489,12 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { imports2Delete.add(PsiTreeUtil.getParentOfType(element, PsiImportStaticStatement.class)); } } + else if (element instanceof PsiMethod) { + PsiAnnotation annotation = AnnotationUtil.findAnnotation((PsiMethod) element, false, Override.class.getName()); + if (annotation != null) { + annotation.delete(); + } + } else if (JavaLanguage.INSTANCE != element.getLanguage()) { GenericInlineHandler.inlineReference(usage, myMethod, myInliners); } diff --git a/java/java-tests/testData/refactoring/inlineMethod/DeleteOverrideAnnotations.java b/java/java-tests/testData/refactoring/inlineMethod/DeleteOverrideAnnotations.java new file mode 100644 index 000000000000..47b425b4a6f0 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/DeleteOverrideAnnotations.java @@ -0,0 +1,12 @@ +class A { + void foo() {} +} + +class B extends A { + @Override + void foo() {} + + void err() { + super.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineMethod/DeleteOverrideAnnotations.java.after b/java/java-tests/testData/refactoring/inlineMethod/DeleteOverrideAnnotations.java.after new file mode 100644 index 000000000000..ef93f313b810 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineMethod/DeleteOverrideAnnotations.java.after @@ -0,0 +1,9 @@ +class A { +} + +class B extends A { + void foo() {} + + void err() { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java index 83180d7d423e..ecffe8d0e407 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java @@ -312,6 +312,10 @@ public class InlineMethodTest extends LightRefactoringTestCase { doTestInlineThisOnly(); } + public void testDeleteOverrideAnnotations() throws Exception { + doTest(); + } + private void doTestInlineThisOnly() { @NonNls String fileName = "/refactoring/inlineMethod/" + getTestName(false) + ".java"; configureByFile(fileName);