IDEA-210560 "Excessive range check" inspection should not warn if expression contains a side effect

This commit is contained in:
Tagir Valeev
2019-04-09 09:56:09 +07:00
parent d727b6b5b9
commit 7c1d1fbaec
2 changed files with 14 additions and 6 deletions
@@ -16,10 +16,7 @@ import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.callMatcher.CallMatcher;
import com.siyeh.ig.psiutils.BoolUtils;
import com.siyeh.ig.psiutils.CommentTracker;
import com.siyeh.ig.psiutils.EquivalenceChecker;
import com.siyeh.ig.psiutils.JavaPsiMathUtil;
import com.siyeh.ig.psiutils.*;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
@@ -81,7 +78,7 @@ public class ExcessiveRangeCheckInspection extends AbstractBaseJavaLocalInspecti
}
if (expression instanceof PsiMethodCallExpression) {
PsiExpression qualifier = ((PsiMethodCallExpression)expression).getMethodExpression().getQualifierExpression();
if (qualifier != null) {
if (qualifier != null && !SideEffectChecker.mayHaveSideEffects(qualifier)) {
if (STRING_IS_EMPTY.matches(expression)) {
return new RangeConstraint(textRange, qualifier, SpecialField.STRING_LENGTH, LongRangeSet.point(0));
}
@@ -172,7 +169,7 @@ public class ExcessiveRangeCheckInspection extends AbstractBaseJavaLocalInspecti
}
}
@NotNull
@Nullable
static RangeConstraint create(TextRange textRange, PsiExpression expr, LongRangeSet set) {
SpecialField field = null;
PsiReferenceExpression ref = expr instanceof PsiReferenceExpression ? (PsiReferenceExpression)expr :
@@ -186,6 +183,9 @@ public class ExcessiveRangeCheckInspection extends AbstractBaseJavaLocalInspecti
}
}
}
if (SideEffectChecker.mayHaveSideEffects(expr)) {
return null;
}
return new RangeConstraint(textRange, expr, field, set);
}
}
@@ -35,5 +35,13 @@ class ExcessiveRangeCheck {
if(<warning descr="Can be replaced with 'map.size() != 2'">map.size() == 0 || map.size() == 1 || map.size() > 2</warning>) {}
if(<warning descr="Can be replaced with 'map.size() != 1'">map.isEmpty() || map.size() > 1</warning>) {}
}
public void testSideEffect() {
if (get() == 0 && get() == 0) {
}
}
native int get();
}