diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java index bb31af967d37..4fb8c991f3fc 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -24,8 +24,6 @@ import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -991,7 +989,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr public MultiMap findConflicts(Ref refUsages) { MultiMap conflictDescriptions = new MultiMap(); - addMethodConflicts(conflictDescriptions); + final PsiMethod prototype = addMethodConflicts(conflictDescriptions); Set usagesSet = new HashSet(Arrays.asList(refUsages.get())); RenameUtil.removeConflictUsages(usagesSet); if (myChangeInfo.isVisibilityChanged()) { @@ -1017,6 +1015,9 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr conflictDescriptions.putValue(baseMethod, "Implicit last parameter should not be deleted"); } } + else if (prototype != null && baseMethod == myChangeInfo.getMethod()) { + ConflictsUtil.checkMethodConflicts(method.getContainingClass(), method, prototype, conflictDescriptions); + } checkContract(conflictDescriptions, method); } @@ -1075,15 +1076,15 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr } - private void addMethodConflicts(MultiMap conflicts) { + private PsiMethod addMethodConflicts(MultiMap conflicts) { String newMethodName = myChangeInfo.getNewName(); try { - PsiMethod prototype; final PsiMethod method = myChangeInfo.getMethod(); - if (!StdLanguages.JAVA.equals(method.getLanguage())) return; + if (!StdLanguages.JAVA.equals(method.getLanguage())) return null; PsiManager manager = method.getManager(); PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory(); final CanonicalTypes.Type returnType = myChangeInfo.getNewReturnType(); + PsiMethod prototype; if (returnType != null) { prototype = factory.createMethod(newMethodName, returnType.getType(method, manager)); } @@ -1105,10 +1106,12 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr } ConflictsUtil.checkMethodConflicts(method.getContainingClass(), myChangeInfo.isGenerateDelegate() ? null : method, prototype, conflicts); + return prototype; } catch (IncorrectOperationException e) { LOG.error(e); } + return null; } } diff --git a/java/java-tests/testData/refactoring/changeSignature/DuplicatedSignatureInInheritor.java b/java/java-tests/testData/refactoring/changeSignature/DuplicatedSignatureInInheritor.java new file mode 100644 index 000000000000..31ca5dfddf90 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/DuplicatedSignatureInInheritor.java @@ -0,0 +1,8 @@ +class A { + void foo() {} +} + +class B extends A { + void foo() {} + void foo(int i) {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java index dfda12377250..e266dea3be73 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java @@ -60,6 +60,14 @@ public class ChangeSignatureTest extends ChangeSignatureBaseTest { catch (BaseRefactoringProcessor.ConflictsInTestsException ignored) { } } + public void testDuplicatedSignatureInInheritor() throws Exception { + try { + doTest(null, new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "i", PsiType.INT)}, true); + fail("Conflict expected"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException ignored) { } + } + public void testGenericTypes() { doTest(null, null, "T", method -> new ParameterInfoImpl[]{ new ParameterInfoImpl(-1, "x", myFactory.createTypeFromText("T", method.getParameterList()), "null"),