From 51af5a631242524a80626ce9d1907a0a53c8ea50 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 8 Jul 2015 18:01:47 +0300 Subject: [PATCH] change signature: ensure propagation works for inheritors (IDEA-142350) --- .../JavaChangeSignatureUsageProcessor.java | 19 +++++++++++++--- .../PropagateParameterWithOverrider.java | 19 ++++++++++++++++ ...PropagateParameterWithOverrider_after.java | 19 ++++++++++++++++ .../refactoring/ChangeSignatureTest.java | 22 +++++++++++++++++++ 4 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/changeSignature/PropagateParameterWithOverrider.java create mode 100644 java/java-tests/testData/refactoring/changeSignature/PropagateParameterWithOverrider_after.java 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 3d72a85ea15d..f90b0982a6c9 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -631,9 +631,22 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr } } - private static boolean needDefaultValue(ChangeInfo changeInfo, PsiMethod method) { - return !(changeInfo instanceof JavaChangeInfoImpl) || - !((JavaChangeInfoImpl)changeInfo).propagateParametersMethods.contains(method); + private static boolean needDefaultValue(ChangeInfo changeInfo, @Nullable PsiMethod method) { + if (!(changeInfo instanceof JavaChangeInfoImpl)) { + return true; + } + if (method != null) { + final Set parametersMethods = ((JavaChangeInfoImpl)changeInfo).propagateParametersMethods; + if (parametersMethods.contains(method)) { + return false; + } + for (PsiMethod superMethod : method.findDeepestSuperMethods()) { + if (parametersMethods.contains(superMethod)) { + return false; + } + } + } + return true; } public static void generateDelegate(JavaChangeInfo changeInfo) throws IncorrectOperationException { diff --git a/java/java-tests/testData/refactoring/changeSignature/PropagateParameterWithOverrider.java b/java/java-tests/testData/refactoring/changeSignature/PropagateParameterWithOverrider.java new file mode 100644 index 000000000000..279d9999ab43 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/PropagateParameterWithOverrider.java @@ -0,0 +1,19 @@ +public class C { + void subject(String s) { + } + + void caller() { + int s; + subject(null); + } + + void caller1() { + caller(); + } +} + +class B extends C { + void caller() { + subject(null); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignature/PropagateParameterWithOverrider_after.java b/java/java-tests/testData/refactoring/changeSignature/PropagateParameterWithOverrider_after.java new file mode 100644 index 000000000000..67934b6d4fb8 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/PropagateParameterWithOverrider_after.java @@ -0,0 +1,19 @@ +public class C { + void subject(String s, boolean b) { + } + + void caller(boolean b) { + int s; + subject(null, b); + } + + void caller1() { + caller(true); + } +} + +class B extends C { + void caller(boolean b) { + subject(null, b); + } +} \ 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 c0147110faca..2061771b80f3 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java @@ -368,6 +368,28 @@ public class ChangeSignatureTest extends ChangeSignatureBaseTest { ).run(); checkResultByFile(basePath + "_after.java"); } + + public void testPropagateParameterWithOverrider() { + String basePath = getRelativePath() + getTestName(false); + configureByFile(basePath + ".java"); + final PsiElement targetElement = TargetElementUtil.findTargetElement(getEditor(), TargetElementUtil.ELEMENT_NAME_ACCEPTED); + assertTrue(" is not on method name", targetElement instanceof PsiMethod); + PsiMethod method = (PsiMethod)targetElement; + final PsiClass containingClass = method.getContainingClass(); + assertTrue(containingClass != null); + final PsiMethod[] callers = containingClass.findMethodsByName("caller", false); + assertTrue(callers.length > 0); + final PsiMethod caller = callers[0]; + final HashSet propagateParametersMethods = new HashSet<>(); + propagateParametersMethods.add(caller); + final PsiParameter[] parameters = method.getParameterList().getParameters(); + new ChangeSignatureProcessor(getProject(), method, false, null, method.getName(), + CanonicalTypes.createTypeWrapper(PsiType.VOID), new ParameterInfoImpl[]{ + new ParameterInfoImpl(0, parameters[0].getName(), parameters[0].getType()), + new ParameterInfoImpl(-1, "b", PsiType.BOOLEAN, "true")}, null, propagateParametersMethods, null + ).run(); + checkResultByFile(basePath + "_after.java"); + } public void testTypeAnnotationsAllAround() { //String[] ps = {"@TA(1) int @TA(2) []", "java.util.@TA(4) List<@TA(5) Class<@TA(6) ?>>", "@TA(7) String @TA(8) ..."};