safe delete: check arg side effects (IDEA-162189)

This commit is contained in:
Anna.Kozlova
2016-10-11 19:09:56 +02:00
parent 0d12e6a313
commit 40f1cdae5f
6 changed files with 36 additions and 3 deletions
@@ -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<PsiElement> sideEffects) {
public static boolean checkSideEffects(PsiExpression element, @Nullable PsiVariable variableToIgnore, List<PsiElement> sideEffects) {
if (sideEffects == null || element == null) return false;
List<PsiElement> writes = new ArrayList<>();
SideEffectChecker.checkSideEffects(element, writes);
@@ -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));
}
}
}
@@ -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();
@@ -0,0 +1,5 @@
class Super {
void foo() {
}
}
@@ -0,0 +1,8 @@
class Super {
void foo(int <caret>i) {}
int bar() {return 0;}
{
foo(bar());
}
}
@@ -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 <b><code>i</code></b> has 1 usage that is not safe to delete.", message);
}
}
public void testUsageInGenerated() throws Exception {
doTest("A");
}