Set<PsiType> (PsiType @NotNull [] conjuncts, Set<PsiType> types) { for (PsiType conjunct : conjuncts) { if (conjunct instanceof PsiIntersectionType) { PsiIntersectionType type = (PsiIntersectionType)conjunct; flatten(type.getConjuncts(), types); } else { types.add(conjunct); } } if (types.size() > 1) { PsiType[] array = types.toArray(createArray(types.size())); for (Iterator<PsiType> iterator = types.iterator(); iterator.hasNext(); ) { PsiType type = iterator.next(); for (PsiType existing : array) { if (type != existing) { final boolean allowUncheckedConversion = type instanceof PsiClassType && ((PsiClassType)type).isRaw(); if (TypeConversionUtil.isAssignable(type, existing, allowUncheckedConversion)) { iterator.remove(); break; } } } } if (types.isEmpty()) { types.add(array[0]); } } return types; }