@NotNull
  private static Specifics isFunctionalTypeMoreSpecific(
      @NotNull CandidateInfo method,
      @NotNull CandidateInfo conflict,
      PsiExpression expr,
      int functionalInterfaceIdx) {
    if (expr instanceof PsiParenthesizedExpression) {
      return isFunctionalTypeMoreSpecific(
          method,
          conflict,
          ((PsiParenthesizedExpression) expr).getExpression(),
          functionalInterfaceIdx);
    }
    if (expr instanceof PsiConditionalExpression) {
      final Specifics thenSpecifics =
          isFunctionalTypeMoreSpecific(
              method,
              conflict,
              ((PsiConditionalExpression) expr).getThenExpression(),
              functionalInterfaceIdx);
      final Specifics elseSpecifics =
          isFunctionalTypeMoreSpecific(
              method,
              conflict,
              ((PsiConditionalExpression) expr).getElseExpression(),
              functionalInterfaceIdx);
      return thenSpecifics == elseSpecifics ? thenSpecifics : Specifics.NEITHER;
    }

    if (expr instanceof PsiFunctionalExpression) {

      if (expr instanceof PsiLambdaExpression
          && !((PsiLambdaExpression) expr).hasFormalParameterTypes()) {
        return Specifics.NEITHER;
      }
      if (expr instanceof PsiMethodReferenceExpression
          && !((PsiMethodReferenceExpression) expr).isExact()) {
        return Specifics.NEITHER;
      }

      final PsiType sType = getFunctionalType(functionalInterfaceIdx, method);
      final PsiType tType = getFunctionalType(functionalInterfaceIdx, conflict);
      if (LambdaUtil.isFunctionalType(sType) && LambdaUtil.isFunctionalType(tType)) {
        final boolean specific12 =
            InferenceSession.isFunctionalTypeMoreSpecificOnExpression(sType, tType, expr);
        final boolean specific21 =
            InferenceSession.isFunctionalTypeMoreSpecificOnExpression(tType, sType, expr);
        if (specific12 && !specific21) return Specifics.FIRST;
        if (!specific12 && specific21) return Specifics.SECOND;
      }
    }
    return Specifics.NEITHER;
  }