mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
safe delete: check arg side effects (IDEA-162189)
This commit is contained in:
+2
-1
@@ -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);
|
||||
|
||||
+3
-2
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+7
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user