From 6b247492daabdc9c59f49151ba494e0bb0c5e176 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Mon, 30 Jul 2018 18:16:59 +0200 Subject: [PATCH] change signature: skip unresolvable usages on accepting refactoring with conflicts (IDEA-196340) --- .../JavaChangeSignatureUsageProcessor.java | 3 ++- .../ConflictingParameterName.java | 13 +++++++++++++ .../ConflictingParameterName.java.after | 13 +++++++++++++ .../ChangeSignaturePropagationTest.java | 17 ++++++++++++++++- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ConflictingParameterName.java create mode 100644 java/java-tests/testData/refactoring/changeSignaturePropagation/ConflictingParameterName.java.after 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 b7960f8a0902..96dfccce1449 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -46,6 +46,7 @@ import com.intellij.psi.util.*; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.rename.RenameUtil; import com.intellij.refactoring.rename.ResolveSnapshotProvider; +import com.intellij.refactoring.rename.UnresolvableCollisionUsageInfo; import com.intellij.refactoring.util.*; import com.intellij.refactoring.util.usageInfo.DefaultConstructorImplicitUsageInfo; import com.intellij.refactoring.util.usageInfo.NoConstructorClassUsageInfo; @@ -200,7 +201,7 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr fixActualArgumentsList(((PsiEnumConstant)element).getArgumentList(), (JavaChangeInfo)changeInfo, true, PsiSubstitutor.EMPTY); return true; } - else if (!(usage instanceof OverriderUsageInfo)) { + else if (!(usage instanceof OverriderUsageInfo) && !(usage instanceof UnresolvableCollisionUsageInfo)) { PsiReference reference = usage instanceof MoveRenameUsageInfo ? usage.getReference() : element.getReference(); if (reference != null) { PsiElement target = changeInfo.getMethod(); diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ConflictingParameterName.java b/java/java-tests/testData/refactoring/changeSignaturePropagation/ConflictingParameterName.java new file mode 100644 index 000000000000..eb3960249464 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ConflictingParameterName.java @@ -0,0 +1,13 @@ +class CallChain { + private void depth1() { + depth2("My first parameter"); + } + + private void depth2(String param) { + depth3(); + } + + private void depth3() { + System.out.println("hello there"); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignaturePropagation/ConflictingParameterName.java.after b/java/java-tests/testData/refactoring/changeSignaturePropagation/ConflictingParameterName.java.after new file mode 100644 index 000000000000..0ab461111f8c --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignaturePropagation/ConflictingParameterName.java.after @@ -0,0 +1,13 @@ +class CallChain { + private void depth1() { + depth2("My first parameter"); + } + + private void depth2(String param, String param) { + depth3(param); + } + + private void depth3(String param) { + System.out.println("hello there"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ChangeSignaturePropagationTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ChangeSignaturePropagationTest.java index 1a5f198f5bbd..0da0762d9979 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ChangeSignaturePropagationTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ChangeSignaturePropagationTest.java @@ -23,16 +23,17 @@ import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.changeSignature.ChangeSignatureProcessor; import com.intellij.refactoring.changeSignature.JavaThrownExceptionInfo; import com.intellij.refactoring.changeSignature.ParameterInfoImpl; import com.intellij.refactoring.changeSignature.ThrownExceptionInfo; import com.intellij.refactoring.util.CanonicalTypes; -import java.util.HashSet; import junit.framework.Assert; import org.jetbrains.annotations.NotNull; import java.util.Arrays; +import java.util.HashSet; import java.util.Set; /** @@ -59,6 +60,20 @@ public class ChangeSignaturePropagationTest extends LightRefactoringTestCase { parameterPropagationTest(method, methods, JavaPsiFacade.getElementFactory(getProject()).createTypeByFQClassName("T")); } + public void testConflictingParameterName() { + final PsiMethod method = getPrimaryMethod(); + final HashSet methods = new HashSet<>(); + for (PsiReference reference : ReferencesSearch.search(method)) { + final PsiMethod psiMethod = PsiTreeUtil.getParentOfType(reference.getElement(), PsiMethod.class); + if (psiMethod != null) { + methods.add(psiMethod); + } + } + PsiClassType stringType = PsiType.getJavaLangString(getPsiManager(), GlobalSearchScope.allScope(getProject())); + final ParameterInfoImpl[] newParameters = {new ParameterInfoImpl(-1, "param", stringType)}; + BaseRefactoringProcessor.ConflictsInTestsException.withIgnoredConflicts(() -> doTest(newParameters, new ThrownExceptionInfo[0], methods, null, method)); + } + public void testExceptionSimple() { exceptionPropagationTest(); }