From 7c1d1fbaec7d02fee6dad19e876e43cf361a9e0d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 9 Apr 2019 09:55:36 +0700 Subject: [PATCH] IDEA-210560 "Excessive range check" inspection should not warn if expression contains a side effect --- .../controlflow/ExcessiveRangeCheckInspection.java | 12 ++++++------ .../excessive_range_check/ExcessiveRangeCheck.java | 8 ++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/controlflow/ExcessiveRangeCheckInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/controlflow/ExcessiveRangeCheckInspection.java index 13b63d77a0d8..a0ac13547234 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/controlflow/ExcessiveRangeCheckInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/controlflow/ExcessiveRangeCheckInspection.java @@ -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); } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/excessive_range_check/ExcessiveRangeCheck.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/excessive_range_check/ExcessiveRangeCheck.java index b7a836f639b9..f466c43c200d 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/excessive_range_check/ExcessiveRangeCheck.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/excessive_range_check/ExcessiveRangeCheck.java @@ -35,5 +35,13 @@ class ExcessiveRangeCheck { if(map.size() == 0 || map.size() == 1 || map.size() > 2) {} if(map.isEmpty() || map.size() > 1) {} } + + public void testSideEffect() { + if (get() == 0 && get() == 0) { + + } + } + + native int get(); } \ No newline at end of file