diff --git a/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java b/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java index af26f2001483..d6ea95349870 100644 --- a/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java @@ -25,11 +25,15 @@ import com.intellij.openapi.util.Comparing; import com.intellij.psi.*; 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.ParameterInfoImpl; +import com.intellij.refactoring.safeDelete.JavaSafeDeleteProcessor; +import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.InlineUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -107,6 +111,19 @@ public class SameParameterValueInspection extends SameParameterValueInspectionBa } public static void inlineSameParameterValue(final PsiMethod method, final PsiParameter parameter, final PsiExpression defToInline) { + final MultiMap conflicts = new MultiMap<>(); + JavaSafeDeleteProcessor.collectMethodConflicts(conflicts, method, parameter); + if (!conflicts.isEmpty()) { + if (ApplicationManager.getApplication().isUnitTestMode()) { + if (!BaseRefactoringProcessor.ConflictsInTestsException.isTestIgnore()) { + throw new BaseRefactoringProcessor.ConflictsInTestsException(conflicts.values()); + } + } + else if (!new ConflictsDialog(parameter.getProject(), conflicts).showAndGet()) { + return; + } + } + final Collection refsToInline = ReferencesSearch.search(parameter).findAll(); ApplicationManager.getApplication().runWriteAction(() -> { diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java index 2b878a92ff76..566d22709267 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java @@ -30,10 +30,8 @@ import com.intellij.refactoring.changeSignature.ChangeSignatureProcessorBase; import com.intellij.refactoring.changeSignature.JavaChangeInfo; import com.intellij.refactoring.changeSignature.JavaChangeInfoImpl; import com.intellij.refactoring.changeSignature.ParameterInfoImpl; -import com.intellij.refactoring.util.CanonicalTypes; -import com.intellij.refactoring.util.InlineUtil; -import com.intellij.refactoring.util.RefactoringUIUtil; -import com.intellij.refactoring.util.RefactoringUtil; +import com.intellij.refactoring.safeDelete.JavaSafeDeleteProcessor; +import com.intellij.refactoring.util.*; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.usageView.UsageViewUtil; @@ -204,6 +202,7 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor @Override protected boolean preprocessUsages(@NotNull Ref refUsages) { final MultiMap conflicts = new MultiMap<>(); + JavaSafeDeleteProcessor.collectMethodConflicts(conflicts, myMethod, myParameter); final UsageInfo[] usages = refUsages.get(); final InaccessibleExpressionsDetector detector = new InaccessibleExpressionsDetector(conflicts); myInitializer.accept(detector); 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 8c0ef09461f9..858d6116dd58 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java @@ -296,15 +296,9 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { 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(); - } + final MultiMap conflicts = new MultiMap<>(); + collectMethodConflicts(conflicts, method, (PsiParameter)element); + return (Collection)conflicts.values(); } } return null; @@ -963,7 +957,17 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { return false; } - + + public static void collectMethodConflicts(MultiMap conflicts, PsiMethod method, PsiParameter parameter) { + final PsiClass containingClass = method.getContainingClass(); + if (containingClass != null) { + final int parameterIndex = method.getParameterList().getParameterIndex(parameter); + final PsiMethod methodCopy = (PsiMethod)method.copy(); + methodCopy.getParameterList().getParameters()[parameterIndex].delete(); + ConflictsUtil.checkMethodConflicts(containingClass, method, methodCopy, conflicts); + } + } + private static class SafeDeleteFunctionalExpressionUsageInfo extends SafeDeleteReferenceUsageInfo { public SafeDeleteFunctionalExpressionUsageInfo(@NotNull PsiElement element, PsiElement referencedElement) { super(element, referencedElement, false); diff --git a/java/java-tests/testData/refactoring/inlineParameter/SameSignatureExistConflict.java b/java/java-tests/testData/refactoring/inlineParameter/SameSignatureExistConflict.java new file mode 100644 index 000000000000..5a78725eb569 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineParameter/SameSignatureExistConflict.java @@ -0,0 +1,6 @@ +class Test { + void doTest(boolean b) {} + void doTest() { + doTest(false); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java index 515105eae59d..be8149f7d70a 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineParameterTest.java @@ -295,6 +295,16 @@ public class InlineParameterTest extends LightRefactoringTestCase { } } + public void testSameSignatureExistConflict() throws Exception { + try { + doTest(false); + fail(); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + assertEquals("Method doTest() is already defined in the class Test", e.getMessage()); + } + } + private void doTest(final boolean createLocal) throws Exception { getProject().putUserData(InlineParameterExpressionProcessor.CREATE_LOCAL_FOR_TESTS,createLocal);