diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableUtil.java index 23f41a3cfb13..70b63da4d515 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableUtil.java @@ -20,6 +20,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.ig.psiutils.SideEffectChecker; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -31,7 +32,7 @@ public class RemoveUnusedVariableUtil { CANCEL } - public static boolean checkSideEffects(PsiExpression element, PsiVariable variableToIgnore, List sideEffects) { + public static boolean checkSideEffects(PsiExpression element, @Nullable PsiVariable variableToIgnore, List sideEffects) { if (sideEffects == null || element == null) return false; List writes = new ArrayList<>(); SideEffectChecker.checkSideEffects(element, writes); diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteDelegateImpl.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteDelegateImpl.java index 9ffe5ad9d184..862bf30fa756 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteDelegateImpl.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteDelegateImpl.java @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.safeDelete; +import com.intellij.codeInsight.daemon.impl.quickfix.RemoveUnusedVariableUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.javadoc.PsiDocMethodOrFieldRef; @@ -58,11 +59,11 @@ public class JavaSafeDeleteDelegateImpl implements JavaSafeDeleteDelegate { final PsiExpression[] args = argList.getExpressions(); if (index < args.length) { if (!parameter.isVarArgs()) { - usages.add(new SafeDeleteReferenceJavaDeleteUsageInfo(args[index], parameter, true)); + usages.add(new SafeDeleteReferenceJavaDeleteUsageInfo(args[index], parameter)); } else { for (int i = index; i < args.length; i++) { - usages.add(new SafeDeleteReferenceJavaDeleteUsageInfo(args[i], parameter, true)); + usages.add(new SafeDeleteReferenceJavaDeleteUsageInfo(args[i], parameter)); } } } diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/usageInfo/SafeDeleteReferenceJavaDeleteUsageInfo.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/usageInfo/SafeDeleteReferenceJavaDeleteUsageInfo.java index 5bcca5fd1963..011ca080ae5f 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/usageInfo/SafeDeleteReferenceJavaDeleteUsageInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/usageInfo/SafeDeleteReferenceJavaDeleteUsageInfo.java @@ -15,12 +15,15 @@ */ package com.intellij.refactoring.safeDelete.usageInfo; +import com.intellij.codeInsight.daemon.impl.quickfix.RemoveUnusedVariableUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; import com.intellij.refactoring.safeDelete.ImportSearcher; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.util.IncorrectOperationException; +import java.util.ArrayList; + /** * @author yole */ @@ -40,6 +43,10 @@ public class SafeDeleteReferenceJavaDeleteUsageInfo extends SafeDeleteReferenceS super(element, referencedElement, startOffset, endOffset, isNonCodeUsage, isSafeDelete); } + public SafeDeleteReferenceJavaDeleteUsageInfo(PsiExpression expression, PsiElement referenceElement) { + this(expression, referenceElement, !RemoveUnusedVariableUtil.checkSideEffects(expression, null, new ArrayList<>())); + } + public void deleteElement() throws IncorrectOperationException { if (isSafeDelete()) { PsiElement element = getElement(); diff --git a/java/java-tests/testData/refactoring/safeDelete/parameterSideEffect/after/Super.java b/java/java-tests/testData/refactoring/safeDelete/parameterSideEffect/after/Super.java new file mode 100644 index 000000000000..91041682ab61 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/parameterSideEffect/after/Super.java @@ -0,0 +1,5 @@ +class Super { + void foo() { + } + +} diff --git a/java/java-tests/testData/refactoring/safeDelete/parameterSideEffect/before/Super.java b/java/java-tests/testData/refactoring/safeDelete/parameterSideEffect/before/Super.java new file mode 100644 index 000000000000..9694760a3561 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/parameterSideEffect/before/Super.java @@ -0,0 +1,8 @@ +class Super { + void foo(int i) {} + int bar() {return 0;} + + { + foo(bar()); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java index 196e9d43e899..db481b14dc3d 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java @@ -245,6 +245,17 @@ public class SafeDeleteTest extends MultiFileTestCase { } } + public void testParameterSideEffect() throws Exception { + try { + doTest("Super"); + fail("Side effect was ignored"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + String message = e.getMessage(); + assertEquals("parameter i has 1 usage that is not safe to delete.", message); + } + } + public void testUsageInGenerated() throws Exception { doTest("A"); }