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 950f3c0b0b89..5be18f7f4096 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/OptionalGetWithoutIsPresentInspection.java @@ -90,15 +90,13 @@ public class OptionalGetWithoutIsPresentInspection extends BaseInspection { if (condition != null) { if (!ControlFlowUtils.statementMayCompleteNormally(ifStatement.getThenBranch())) { checker.negate = true; - checker.checkExpression(condition); - if (checker.hasIsPresentCall()) { + if (checker.checkExpression(condition)) { return true; } } else if (!ControlFlowUtils.statementMayCompleteNormally(ifStatement.getElseBranch())) { checker.negate = false; - checker.checkExpression(condition); - if (checker.hasIsPresentCall()) { + if (checker.checkExpression(condition)) { return true; } } @@ -108,11 +106,30 @@ public class OptionalGetWithoutIsPresentInspection extends BaseInspection { final PsiAssertStatement assertStatement = (PsiAssertStatement)sibling; final PsiExpression condition = assertStatement.getAssertCondition(); checker.negate = false; - checker.checkExpression(condition); - if (checker.hasIsPresentCall()) { + if (checker.checkExpression(condition)) { return true; } } + else if (sibling instanceof PsiExpressionStatement) { + final PsiExpressionStatement expressionStatement = (PsiExpressionStatement)sibling; + final PsiExpression expression = expressionStatement.getExpression(); + if (expression instanceof PsiMethodCallExpression) { + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression; + if (MethodCallUtils.isCallToMethod(methodCallExpression, "org.junit.Assert", PsiType.VOID, "assertTrue", null) || + MethodCallUtils.isCallToMethod(methodCallExpression, "junit.framework.Assert", PsiType.VOID, "assertTrue", null) || + MethodCallUtils.isCallToMethod(methodCallExpression, "org.testng.Assert", PsiType.VOID, "assertTrue", null) || + MethodCallUtils.isCallToMethod(methodCallExpression, "org.testng.AssertJUnit", PsiType.VOID, "assertTrue", null)) { + checker.negate = false; + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + for (PsiExpression argument : arguments) { + if (checker.checkExpression(argument)) { + return true; + } + } + } + } + } sibling = PsiTreeUtil.getPrevSiblingOfType(sibling, PsiStatement.class); } checker.negate = false; @@ -185,16 +202,16 @@ public class OptionalGetWithoutIsPresentInspection extends BaseInspection { checkExpression(expression.getCondition()); } - private void checkExpression(PsiExpression expression) { + private boolean checkExpression(PsiExpression expression) { expression = PsiUtil.deparenthesizeExpression(expression); if (expression instanceof PsiPrefixExpression) { final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)expression; final IElementType tokenType = prefixExpression.getOperationTokenType(); if (tokenType != JavaTokenType.EXCL) { - return; + return false; } negate = !negate; - checkExpression(prefixExpression.getOperand()); + return checkExpression(prefixExpression.getOperand()); } else if (expression instanceof PsiPolyadicExpression) { final PsiPolyadicExpression binaryExpression = (PsiPolyadicExpression)expression; @@ -205,11 +222,11 @@ public class OptionalGetWithoutIsPresentInspection extends BaseInspection { final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); final String name = methodExpression.getReferenceName(); if (!"isPresent".equals(name)) { - return; + return false; } final PsiExpression qualifier = ParenthesesUtils.stripParentheses(methodExpression.getQualifierExpression()); if (!(qualifier instanceof PsiReferenceExpression)) { - return; + return false; } final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifier; hasIsPresentCall = !negate && EquivalenceChecker.expressionsAreEquivalent(referenceExpression, this.referenceExpression); @@ -219,10 +236,11 @@ public class OptionalGetWithoutIsPresentInspection extends BaseInspection { final PsiExpression definition = VariableSearchUtils.findDefinition(referenceExpression, null); final PsiExpression optionalDefinition = VariableSearchUtils.findDefinition(this.referenceExpression, null); if (definition == null || optionalDefinition == null || optionalDefinition.getTextOffset() > definition.getTextOffset()) { - return; + return false; } - checkExpression(definition); + return checkExpression(definition); } + return hasIsPresentCall; } public boolean hasIsPresentCall() { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/optional_get_without_is_present/OptionalGetWithoutIsPresent.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/optional_get_without_is_present/OptionalGetWithoutIsPresent.java index 44c0b5ada70e..641210bd6a56 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/optional_get_without_is_present/OptionalGetWithoutIsPresent.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/optional_get_without_is_present/OptionalGetWithoutIsPresent.java @@ -38,4 +38,16 @@ class OptionalWithoutIsPresent { System.out.println(string); } } + + private void checkAsserts() { + Optional o1 = Optional.empty(); + assert o1.isPresent(); + System.out.println(o1.get()); + Optional o2 = Optional.empty(); + org.junit.Assert.assertTrue(o2.isPresent()); + System.out.println(o2.get()); + Optional o3 = Optional.empty(); + org.testng.Assert.assertTrue(o3.isPresent()); + System.out.println(o3.get()); + } } \ No newline at end of file