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 23d69933b2df..5fa97ad6a7f6 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java @@ -32,8 +32,10 @@ import com.intellij.psi.impl.source.javadoc.PsiDocMethodOrFieldRef; import com.intellij.psi.javadoc.PsiDocTag; import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.search.searches.SuperMethodsSearch; -import com.intellij.psi.util.*; +import com.intellij.psi.util.MethodSignatureUtil; +import com.intellij.psi.util.PropertyUtil; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.safeDelete.usageInfo.*; import com.intellij.refactoring.util.RefactoringMessageUtil; @@ -105,23 +107,20 @@ public class JavaSafeDeleteProcessor implements SafeDeleteProcessorDelegate { } else if (element instanceof PsiParameter && ((PsiParameter) element).getDeclarationScope() instanceof PsiMethod) { PsiMethod method = (PsiMethod) ((PsiParameter) element).getDeclarationScope(); - final Set parametersToDelete = new com.intellij.util.containers.HashSet(); + final Set parametersToDelete = new HashSet(); parametersToDelete.add((PsiParameter) element); final int parameterIndex = method.getParameterList().getParameterIndex((PsiParameter) element); - SuperMethodsSearch.search(method, null, true, false).forEach(new Processor() { - public boolean process(MethodSignatureBackedByPsiMethod signature) { - parametersToDelete.add(signature.getMethod().getParameterList().getParameters()[parameterIndex]); - return true; - } - }); + for (PsiMethod superMethod : method.findDeepestSuperMethods()) { + parametersToDelete.add(superMethod.getParameterList().getParameters()[parameterIndex]); + OverridingMethodsSearch.search(superMethod).forEach(new Processor() { + public boolean process(PsiMethod overrider) { + parametersToDelete.add(overrider.getParameterList().getParameters()[parameterIndex]); + return true; + } + }); + } - OverridingMethodsSearch.search(method).forEach(new Processor() { - public boolean process(PsiMethod overrider) { - parametersToDelete.add(overrider.getParameterList().getParameters()[parameterIndex]); - return true; - } - }); - if (parametersToDelete.size() > 1) { + if (parametersToDelete.size() > 1 && !ApplicationManager.getApplication().isUnitTestMode()) { String message = RefactoringBundle.message("0.is.a.part.of.method.hierarchy.do.you.want.to.delete.multiple.parameters", UsageViewUtil.getLongName(method)); if (Messages.showYesNoDialog(project, message, SafeDeleteHandler.REFACTORING_NAME, Messages.getQuestionIcon()) != DialogWrapper.OK_EXIT_CODE) return null; diff --git a/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/C1.java b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/C1.java new file mode 100644 index 000000000000..e6bf0c8af2f4 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/C1.java @@ -0,0 +1,5 @@ +public class C1 implements I { + public void f(int a1) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/I.java b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/I.java new file mode 100644 index 000000000000..20296d966017 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/I.java @@ -0,0 +1,3 @@ +public interface I { + void f(int a1); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/Super.java b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/Super.java new file mode 100644 index 000000000000..3d899d0a5e2c --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/after/Super.java @@ -0,0 +1,5 @@ +public class C2 extends C1 { + public void f(int a1) { + super.f(a1 ); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/C1.java b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/C1.java new file mode 100644 index 000000000000..e203f997c4e5 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/C1.java @@ -0,0 +1,5 @@ +public class C1 implements I { + public void f(int a1, int a2) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/I.java b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/I.java new file mode 100644 index 000000000000..47e45075c2c7 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/I.java @@ -0,0 +1,3 @@ +public interface I { + void f(int a1, int a2); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/Super.java b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/Super.java new file mode 100644 index 000000000000..cda02b447891 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/parameterInHierarchy/before/Super.java @@ -0,0 +1,5 @@ +public class C2 extends C1 { + public void f(int a1, int a2) { + super.f(a1, a2); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java index de3ba489f19d..70790ee3da65 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java @@ -56,6 +56,11 @@ public class SafeDeleteTest extends MultiFileTestCase { doTest("IFoo"); } + public void testParameterInHierarchy() throws Exception { + myDoCompare = false; + doTest("C2"); + } + public void testExtendsList() throws Exception { myDoCompare = false; doTest("B"); @@ -123,7 +128,7 @@ public class SafeDeleteTest extends MultiFileTestCase { final PsiElement psiElement = TargetElementUtilBase .findTargetElement(myEditor, TargetElementUtilBase.ELEMENT_NAME_ACCEPTED | TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED); - SafeDeleteHandler.invoke(getProject(), new PsiElement[]{psiElement}, false); + SafeDeleteHandler.invoke(getProject(), new PsiElement[]{psiElement}, true); } protected String getTestRoot() {