PsiType (final PsiExpression psiExpression) { PsiType result = null; if (null != psiExpression && !(psiExpression instanceof PsiArrayInitializerExpression)) { result = RecursionManager.doPreventingRecursion(psiExpression, true, () -> { PsiType type = psiExpression.getType(); // This is how IntelliJ resolves intersection types. // This way auto-completion won't show unavailable methods. if (type instanceof final PsiIntersectionType psiIntersectionType) { PsiType[] conjuncts = psiIntersectionType.getConjuncts(); if (conjuncts.length > 0) { return conjuncts[0]; } } if (type != null) { //Get upward projection, so you don't get types with missing diamonds. return JavaVarTypeUtil.getUpwardProjection(type); } return null; }); } return result; }