NotNullContext (@NotNull PsiIfStatement ifStatement) { PsiExpression condition = PsiUtil.skipParenthesizedExprDown(ifStatement.getCondition()); if(condition == null) return null; PsiBinaryExpression binOp = tryCast(condition, PsiBinaryExpression.class); if(binOp == null) return null; PsiExpression value = PsiUtil.skipParenthesizedExprDown(ExpressionUtils.getValueComparedWithNull(binOp)); PsiReferenceExpression referenceExpression = tryCast(value, PsiReferenceExpression.class); if(referenceExpression == null) return null; PsiVariable variable = tryCast(referenceExpression.resolve(), PsiVariable.class); if(variable == null) return null; if(ClassUtils.isPrimitive(variable.getType())) return null; boolean inverted = binOp.getOperationTokenType() == JavaTokenType.NE; PsiStatement elseBranch = ControlFlowUtils.stripBraces(ifStatement.getElseBranch()); PsiStatement thenBranch = ControlFlowUtils.stripBraces(ifStatement.getThenBranch()); if(elseBranch != null) { PsiStatement nullBranch = inverted? thenBranch : elseBranch; PsiStatement nonNullBranch = inverted? elseBranch : thenBranch; return extractContext(ifStatement, variable, referenceExpression, nullBranch, nonNullBranch, null); } else { PsiReturnStatement nextReturn = tryCast(PsiTreeUtil.skipWhitespacesAndCommentsForward(ifStatement), PsiReturnStatement.class); if (nextReturn == null) return null; if (thenBranch instanceof PsiReturnStatement) { PsiStatement nullBranch = inverted? thenBranch : nextReturn; PsiStatement nonNullBranch = inverted? nextReturn : thenBranch; return extractContext(ifStatement, variable, referenceExpression, nullBranch, nonNullBranch, nextReturn); } } return null; }