@Contract(pure = true)
  @NotNull
  public static TypeDfaState merge(@NotNull TypeDfaState left, @NotNull TypeDfaState right, PsiManager manager) {
    if (left == right) {
      return left;
    }
    Int2ObjectMap<DFAType> dominantMap = guessDominantMap(left.myVarTypes, right.myVarTypes);
    if (dominates(left, right, dominantMap)) {
      return left;
    }
    if (dominates(right, left, dominantMap)) {
      return right;
    }
    BitSet resultSet = mergeProhibitedVariables(left.myProhibitedCachingVars, right.myProhibitedCachingVars);
    Int2ObjectMap<DFAType> resultMap = dominantMap != null ? dominantMap : mergeTypeMaps(left.myVarTypes, right.myVarTypes, manager, resultSet);
    return new TypeDfaState(resultMap, resultSet);
  }
@Contract(pure = true)
  @NotNull
  public static TypeDfaState merge(@NotNull TypeDfaState left, @NotNull TypeDfaState right, PsiManager manager)