public static @Nullable <O extends PsiExpression> OrderedBinaryExpression<O, PsiExpression> from(@Nullable final PsiExpression node,
                                                                                                   @Nullable final Class<O> firstClass) {
    PsiBinaryExpression expression = as(node, PsiBinaryExpression.class);
    if (expression == null || firstClass == null) return null;
    O leftOperand = as(expression.getLOperand(), firstClass);
    O rightOperand = as(expression.getROperand(), firstClass);
    PsiExpression unparenthesizedRightOperand = PsiUtil.skipParenthesizedExprDown(expression.getROperand());
    if (leftOperand != null && rightOperand == null && unparenthesizedRightOperand != null) {
      return new OrderedBinaryExpression<>(leftOperand, expression.getOperationTokenType(), unparenthesizedRightOperand);
    }
    if (leftOperand == null && rightOperand != null) {
      IElementType mirroredOperator = mirrorOperator(expression);
      PsiExpression unparenthesizedLeftOperand = PsiUtil.skipParenthesizedExprDown(expression.getLOperand());
      if (mirroredOperator != null && unparenthesizedLeftOperand != null) {
        return new OrderedBinaryExpression<>(rightOperand, mirroredOperator, unparenthesizedLeftOperand);
      }
    }
    return null;
  }
public static @Nullable <O extends PsiExpression> OrderedBinaryExpression<O, PsiExpression> from(@Nullable final PsiExpression node,
                                                                                                   @Nullable final Class<O> firstClass)