boolean (PsiExpression expression, boolean allowNpe) { // Disallow anything which may throw or produce side effect return PsiTreeUtil.processElements(expression, element -> { if (element instanceof PsiMethodCallExpression) { PsiMethod method = ((PsiMethodCallExpression)element).resolveMethod(); if (method == null || !JavaMethodContractUtil.isPure(method)) return false; PsiClass aClass = method.getContainingClass(); return aClass != null && CommonClassNames.JAVA_LANG_STRING.equals(aClass.getQualifiedName()); } if (element instanceof PsiCallExpression || element instanceof PsiArrayAccessExpression || element instanceof PsiTypeCastExpression || isErroneous(element)) { return false; } if (element instanceof PsiExpression && PsiUtil.isAccessedForWriting((PsiExpression)element)) { return false; } if (element instanceof PsiSwitchExpression) { // We cannot correctly process possible NPE in switch selector expression inside // ConditionCoveredByFurtherConditionInspection.computeOperandValues, // so let's conservatively assume that the exception is possible return false; } if (element instanceof PsiReferenceExpression ref) { if (!allowNpe) { PsiExpression qualifier = PsiUtil.skipParenthesizedExprDown(ref.getQualifierExpression()); if (qualifier != null && NullabilityUtil.getExpressionNullability(qualifier) != Nullability.NOT_NULL) { if (qualifier instanceof PsiReferenceExpression) { PsiElement target = ((PsiReferenceExpression)qualifier).resolve(); return target instanceof PsiClass || target instanceof PsiPackage; } return false; } } PsiType type = ref.getType(); PsiType expectedType = ExpectedTypeUtils.findExpectedType(ref, false); if (type != null && !(type instanceof PsiPrimitiveType) && expectedType instanceof PsiPrimitiveType) { // Unboxing is possible return false; } } if (element instanceof PsiPolyadicExpression expr) { IElementType type = expr.getOperationTokenType(); if (type.equals(JavaTokenType.DIV) || type.equals(JavaTokenType.PERC)) { PsiExpression[] operands = expr.getOperands(); if (operands.length != 2) return false; Object divisor = ExpressionUtils.computeConstantExpression(operands[1]); if ((!(divisor instanceof Integer) && !(divisor instanceof Long)) || ((Number)divisor).longValue() == 0) return false; } } return true; }); }