From 9d43d2f2352290cc4a571819a4a01a5ed140586a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 13 Apr 2016 17:30:04 +0200 Subject: [PATCH] IDEA-153817 ('Optional.get() without isPresent() check' inspection should support while statement) --- ...OptionalGetWithoutIsPresentInspection.java | 19 +++++++++++--- ...onalGetWithoutIsPresentInspectionTest.java | 26 ++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspection.java index 6c3822dc1b7d..d5e3601e1a56 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspection.java @@ -109,6 +109,14 @@ public class OptionalGetWithoutIsPresentInspection extends BaseInspection { } } } + else if (sibling instanceof PsiWhileStatement) { + final PsiWhileStatement whileStatement = (PsiWhileStatement)sibling; + final PsiExpression condition = whileStatement.getCondition(); + checker.negate = true; + if (checker.checkExpression(condition)) { + return true; + } + } else if (sibling instanceof PsiAssertStatement) { final PsiAssertStatement assertStatement = (PsiAssertStatement)sibling; final PsiExpression condition = assertStatement.getAssertCondition(); @@ -140,15 +148,15 @@ public class OptionalGetWithoutIsPresentInspection extends BaseInspection { sibling = PsiTreeUtil.getPrevSiblingOfType(sibling, PsiStatement.class); } checker.negate = false; - PsiElement parent = PsiTreeUtil.getParentOfType(context, PsiIfStatement.class, PsiConditionalExpression.class, + PsiElement parent = PsiTreeUtil.getParentOfType(context, PsiIfStatement.class, PsiWhileStatement.class, PsiConditionalExpression.class, PsiPolyadicExpression.class); while (parent != null) { parent.accept(checker); if (checker.hasIsPresentCall()) { return true; } - parent = PsiTreeUtil.getParentOfType(parent, PsiPolyadicExpression.class, PsiIfStatement.class, - PsiConditionalExpression.class); + parent = PsiTreeUtil.getParentOfType(parent, PsiIfStatement.class, PsiWhileStatement.class, PsiConditionalExpression.class, + PsiPolyadicExpression.class); } return checker.hasIsPresentCall(); } @@ -188,6 +196,11 @@ public class OptionalGetWithoutIsPresentInspection extends BaseInspection { } } + @Override + public void visitWhileStatement(PsiWhileStatement statement) { + checkExpression(statement.getCondition()); + } + @Override public void visitIfStatement(PsiIfStatement ifStatement) { final PsiStatement elseBranch = ifStatement.getElseBranch(); diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspectionTest.java index 81156b9ba0f7..c8f1db0b7345 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspectionTest.java @@ -17,7 +17,6 @@ package com.siyeh.ig.bugs; import com.intellij.codeInspection.InspectionProfileEntry; import com.siyeh.ig.LightInspectionTestCase; -import junit.framework.TestCase; import org.jetbrains.annotations.Nullable; /** @@ -55,6 +54,31 @@ public class OptionalGetWithoutIsPresentInspectionTest extends LightInspectionTe "}"); } + public void testWhile1() { + doTest("import java.util.Optional;" + + "class X {" + + " void m() {" + + " Optional o = Optional.empty();" + + " while (!o.isPresent()){" + + " o = Optional.of(\"\");" + + " }" + + " o.get();" + + " }" + + "}"); + } + + public void testWhile2() { + doTest("import java.util.Optional;" + + "class X {" + + " void m() {" + + " Optional o = Optional.empty();" + + " while (o.isPresent()) {" + + " o.get();" + + " }" + + " }" + + "}"); + } + public void testOptionalGetWithoutIsPresent() { doTest(); }