@Contract(pure = true)
  @NotNull
  public static DFAType merge(DFAType t1, DFAType t2, PsiManager manager) {
    if (t1.equals(t2)) return t1;
    if (dominates(t1, t2)) {
      return t1;
    }
    if (dominates(t2, t1)) {
      return t2;
    }
    final PsiType primary = TypesUtil.getLeastUpperBoundNullable(t1.primary, t2.primary, manager);
    final PsiType type1 = reduce(t1.mixins);
    final PsiType type2 = reduce(t2.mixins);
    if (type1 != null && type2 != null) {
      return create(primary).withNewMixin(GenericsUtil.getLeastUpperBound(type1, type2, manager), null);
    }
    return create(primary);
  }
@Contract(pure = true)
  @NotNull
  public static DFAType merge(DFAType t1, DFAType t2, PsiManager manager)