@NotNull
  private static Int2ObjectMap<DFAType> mergeTypeMaps(Int2ObjectMap<DFAType> leftMap,
                                                      Int2ObjectMap<DFAType> rightMap,
                                                      PsiManager manager,
                                                      BitSet prohibited) {
    Int2ObjectMap<DFAType> newFMap = new Int2ObjectOpenHashMap<>();
    Stream.concat(rightMap.int2ObjectEntrySet().stream(), leftMap.int2ObjectEntrySet().stream()).forEach(entry -> {
      int descriptorId = entry.getIntKey();
      if (descriptorId == 0 || prohibited.get(descriptorId) || !leftMap.containsKey(descriptorId) || !rightMap.containsKey(descriptorId)) {
        return;
      }
      DFAType candidate = entry.getValue();
      DFAType existing = newFMap.get(descriptorId);
      if (existing == null) {
        newFMap.put(descriptorId, candidate);
      }
      else if (candidate != existing) {
        newFMap.put(descriptorId, DFAType.merge(candidate, existing, manager));
      }
    });
    return newFMap;
  }
@NotNull
  private static Int2ObjectMap<DFAType> mergeTypeMaps(Int2ObjectMap<DFAType> leftMap,
                                                      Int2ObjectMap<DFAType> rightMap,
                                                      PsiManager manager,
                                                      BitSet prohibited)