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 09a162f33a93..5e2906f9fcf7 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -48,6 +48,7 @@ import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import com.siyeh.IntentionPowerPackBundle; +import com.siyeh.ig.psiutils.MethodCallUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -1213,15 +1214,38 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr final PsiCodeBlock body = method.getBody(); if (body != null) { final LocalSearchScope searchScope = new LocalSearchScope(body); + final PsiMethodCallExpression superCall = getSuperCall(method, body); for (int i = 0; i < toRemove.length; i++) { - if (toRemove[i] && ReferencesSearch.search(parameters[i], searchScope).findFirst() != null) { - String paramName = StringUtil.capitalize(RefactoringUIUtil.getDescription(parameters[i], true)); - conflictDescriptions.putValue(parameters[i], JavaRefactoringBundle.message("parameter.used.in.method.body.warning", paramName)); + if (toRemove[i]) { + for (PsiReference ref : ReferencesSearch.search(parameters[i], searchScope)) { + if (superCall == null || !passUnchangedParameterToSuperCall(superCall, i, ref)) { + String paramName = StringUtil.capitalize(RefactoringUIUtil.getDescription(parameters[i], true)); + conflictDescriptions.putValue(parameters[i], JavaRefactoringBundle.message("parameter.used.in.method.body.warning", paramName)); + break; + } + } } } } } + private static boolean passUnchangedParameterToSuperCall(PsiMethodCallExpression superCall, int i, PsiReference ref) { + return ArrayUtil.find(superCall.getArgumentList().getExpressions(), PsiUtil.skipParenthesizedExprUp(ref.getElement())) == i; + } + + private static PsiMethodCallExpression getSuperCall(PsiMethod method, PsiCodeBlock body) { + PsiStatement[] statements = body.getStatements(); + PsiStatement firstStmt = statements.length > 0 ? statements[0] : null; + if (firstStmt instanceof PsiExpressionStatement) { + PsiExpression call = ((PsiExpressionStatement)firstStmt).getExpression(); + if (call instanceof PsiMethodCallExpression && + MethodCallUtils.isSuperMethodCall((PsiMethodCallExpression)call, method)) { + return (PsiMethodCallExpression)call; + } + } + return null; + } + private void checkContract(MultiMap conflictDescriptions, PsiMethod method, boolean override) { try { ContractConverter.convertContract(method, myChangeInfo); diff --git a/java/java-tests/testData/refactoring/changeSignature/NoConflictForSuperCallDelegation.java b/java/java-tests/testData/refactoring/changeSignature/NoConflictForSuperCallDelegation.java new file mode 100644 index 000000000000..6953ef3ab2a1 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/NoConflictForSuperCallDelegation.java @@ -0,0 +1,9 @@ +class A { + void foo(int i) {} +} + +class B extends A { + void foo(int i) { + super.foo(i); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignature/NoConflictForSuperCallDelegation_after.java b/java/java-tests/testData/refactoring/changeSignature/NoConflictForSuperCallDelegation_after.java new file mode 100644 index 000000000000..16c0fff36755 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/NoConflictForSuperCallDelegation_after.java @@ -0,0 +1,9 @@ +class A { + void foo() {} +} + +class B extends A { + void foo() { + super.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ChangeSignatureTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ChangeSignatureTest.java index 1d9e494dce7b..0345a7e150de 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ChangeSignatureTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ChangeSignatureTest.java @@ -80,6 +80,10 @@ public class ChangeSignatureTest extends ChangeSignatureBaseTest { catch (BaseRefactoringProcessor.ConflictsInTestsException ignored) { } } + public void testNoConflictForSuperCallDelegation() { + doTest(null, new ParameterInfoImpl[0], false); + } + public void testGenericTypes() { doTest(null, null, "T", method -> new ParameterInfoImpl[]{ ParameterInfoImpl.createNew().withName("x").withType(myFactory.createTypeFromText("T", method.getParameterList())).withDefaultValue("null"),