@Nullable
  static Set<PsiClass> getPossibleTypes(@NotNull PsiExpression expression, int maxDepth) {
    if (maxDepth == 0) return null;

    expression = PsiUtil.skipParenthesizedExprDown(expression);

    return expression instanceof PsiTypeCastExpression || expression instanceof PsiThisExpression ? extractClass(expression.getType()) :
           expression instanceof PsiMethodCallExpression ? getCallType(expression, maxDepth) :
           expression instanceof PsiReferenceExpression ? getNonCallType((PsiReferenceExpression)expression, maxDepth) :
           expression instanceof PsiNewExpression ? getNewType((PsiNewExpression)expression) :
           expression instanceof PsiConditionalExpression ? getConditionalType((PsiConditionalExpression)expression, maxDepth) :
           null;
  }
@Nullable
  static Set<PsiClass> getPossibleTypes(@NotNull PsiExpression expression, int maxDepth)