private void checkExpression(PsiExpression expression) {
      final PsiElement parent = expression.getParent();
      if (parent instanceof PsiParenthesizedExpression) {
        return;
      }
      if (parent instanceof PsiAssignmentExpression assignmentExpression) {
        if (assignmentExpression.getOperationTokenType() != JavaTokenType.EQ) {
          if (assignmentExpression.getLExpression() == expression) {
            final PsiExpression rhs = assignmentExpression.getRExpression();
            if (rhs != null) {
              final PsiType expressionType = expression.getType();
              if (!ClassUtils.isPrimitiveNumericType(expressionType)) return;
              final PsiType rhsType = rhs.getType();
              if (!ClassUtils.isPrimitiveNumericType(rhsType)) return;
              final PsiType promotedType = TypeConversionUtil.binaryNumericPromotion(expressionType, rhsType);
              if (checkTypes(assignmentExpression, promotedType, expressionType)) return;
              if (ignoreWideningConversions) return;
              checkTypes(rhs, rhsType, promotedType);
            }
          }
          return;
        }
      }
      if (ignoreWideningConversions) {
        // Further analysis could be quite slow, especially in batch mode, as type of almost every expression is queried.
        // So stop here if ignoreWideningConversions is on.
        return;
      }
      final PsiType expressionType = expression.getType();
      if (!ClassUtils.isPrimitiveNumericType(expressionType)) {
        return;
      }
      final PsiType expectedType = ExpectedTypeUtils.findExpectedType(expression, true);
      if (!ClassUtils.isPrimitiveNumericType(expectedType)) {
        return;
      }
      checkTypes(expression, expressionType, expectedType);
    }
private void checkExpression(PsiExpression expression)