public static @Nullable <F extends PsiExpression, S extends PsiExpression> OrderedBinaryExpression<F, S> from(@Nullable final PsiExpression node,
                                                                                                                @Nullable final Class<F> firstClass,
                                                                                                                @Nullable final Class<S> secondClass) {
    PsiBinaryExpression expression = as(node, PsiBinaryExpression.class);
    if (expression == null || firstClass == null || secondClass == null) return null;
    F leftFirst = as(expression.getLOperand(), firstClass);
    S rightSecond = as(expression.getROperand(), secondClass);
    if (leftFirst != null && rightSecond != null) {
      return new OrderedBinaryExpression<>(leftFirst, expression.getOperationTokenType(), rightSecond);
    }
    IElementType mirroredOperator = mirrorOperator(expression);
    if (mirroredOperator != null) {
      F rightFirst = as(expression.getROperand(), firstClass);
      S leftSecond = as(expression.getLOperand(), secondClass);

      if (rightFirst != null && leftSecond != null) {
        return new OrderedBinaryExpression<>(rightFirst, mirroredOperator, leftSecond);
      }
    }
    return null;
  }
public static @Nullable <F extends PsiExpression, S extends PsiExpression> OrderedBinaryExpression<F, S> from(@Nullable final PsiExpression node,
                                                                                                                @Nullable final Class<F> firstClass,
                                                                                                                @Nullable final Class<S> secondClass)