diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java index dee26d6d80bb..00993f51fbeb 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java @@ -49,8 +49,10 @@ import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewUtil; import com.intellij.usages.*; import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.tree.TreeUtil; @@ -291,7 +293,28 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { if (!dialog.showAndGet()) { return null; } - result.addAll(dialog.getSelected()); + final ArrayList selected = dialog.getSelected(); + final Set unselected = new HashSet(overridingMethods); + unselected.removeAll(selected); + + if (!unselected.isEmpty()) { + final List unselectedMethods = ContainerUtil.map(unselected, new Function() { + @Override + public PsiMethod fun(UsageInfo info) { + return ((SafeDeleteOverridingMethodUsageInfo)info).getOverridingMethod(); + } + }); + + for (Iterator iterator = result.iterator(); iterator.hasNext(); ) { + final UsageInfo info = iterator.next(); + if (info instanceof SafeDeleteOverrideAnnotation && + !allSuperMethodsSelectedToDelete(unselectedMethods, ((SafeDeleteOverrideAnnotation)info).getMethod())) { + iterator.remove(); + } + } + } + + result.addAll(selected); } } @@ -356,6 +379,12 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { return result.toArray(new UsageInfo[result.size()]); } + private static boolean allSuperMethodsSelectedToDelete(List unselectedMethods, PsiMethod method) { + final ArrayList superMethods = new ArrayList(Arrays.asList(method.findSuperMethods())); + superMethods.retainAll(unselectedMethods); + return superMethods.isEmpty(); + } + public void prepareForDeletion(final PsiElement element) throws IncorrectOperationException { if (element instanceof PsiVariable) { ((PsiVariable)element).normalizeDeclaration();