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 d2535ce6bee3..897036618d0d 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java @@ -41,6 +41,7 @@ import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.changeSignature.inCallers.JavaCallerChooser; import com.intellij.refactoring.safeDelete.usageInfo.*; +import com.intellij.refactoring.util.ConflictsUtil; import com.intellij.refactoring.util.RefactoringChangeUtil; import com.intellij.refactoring.util.RefactoringMessageUtil; import com.intellij.refactoring.util.RefactoringUIUtil; @@ -49,6 +50,7 @@ import com.intellij.usageView.UsageViewUtil; import com.intellij.usages.*; import com.intellij.util.*; import com.intellij.util.containers.HashMap; +import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -237,6 +239,21 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { } } } + else if (element instanceof PsiParameter) { + final PsiElement scope = ((PsiParameter)element).getDeclarationScope(); + if (scope instanceof PsiMethod) { + final PsiMethod method = (PsiMethod)scope; + final PsiClass containingClass = method.getContainingClass(); + if (containingClass != null) { + final int parameterIndex = method.getParameterList().getParameterIndex((PsiParameter)element); + final PsiMethod methodCopy = (PsiMethod)method.copy(); + methodCopy.getParameterList().getParameters()[parameterIndex].delete(); + final MultiMap conflicts = new MultiMap(); + ConflictsUtil.checkMethodConflicts(containingClass, method, methodCopy, conflicts); + return (Collection)conflicts.values(); + } + } + } return null; } diff --git a/java/java-tests/testData/refactoring/safeDelete/AmbiguityAfterParameterDelete.java b/java/java-tests/testData/refactoring/safeDelete/AmbiguityAfterParameterDelete.java new file mode 100644 index 000000000000..34fc102f59c6 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/AmbiguityAfterParameterDelete.java @@ -0,0 +1,4 @@ +class Test { + void foo(int i) {} + void foo() {} +} \ 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 03bc96892db7..428f978b9327 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java @@ -178,6 +178,17 @@ public class SafeDeleteTest extends MultiFileTestCase { } } + public void testAmbiguityAfterParameterDelete() throws Exception { + try { + doSingleFileTest(); + fail("Conflict was not detected"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + String message = e.getMessage(); + assertEquals("Method foo() is already defined in the class Test", message); + } + } + public void testFunctionalInterfaceDefaultMethod() throws Exception { LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8); doSingleFileTest();