private ClassMapCachingNulls<MultiHostInjector> getInjectorMap() {
    ClassMapCachingNulls<MultiHostInjector> cached = cachedInjectors;
    if (cached != null) {
      return cached;
    }

    Map<Class, MultiHostInjector[]> injectors = ContainerUtil.newHashMap();

    List<MultiHostInjector> allInjectors = ContainerUtil.newArrayList();
    allInjectors.addAll(myManualInjectors);
    Collections.addAll(
        allInjectors, MultiHostInjector.MULTIHOST_INJECTOR_EP_NAME.getExtensions(myProject));
    if (LanguageInjector.EXTENSION_POINT_NAME.getExtensions().length > 0) {
      allInjectors.add(PsiManagerRegisteredInjectorsAdapter.INSTANCE);
    }

    for (MultiHostInjector injector : allInjectors) {
      for (Class<? extends PsiElement> place : injector.elementsToInjectIn()) {
        LOG.assertTrue(place != null, injector);
        MultiHostInjector[] existing = injectors.get(place);
        injectors.put(
            place,
            existing == null
                ? new MultiHostInjector[] {injector}
                : ArrayUtil.append(existing, injector));
      }
    }

    ClassMapCachingNulls<MultiHostInjector> result =
        new ClassMapCachingNulls<>(injectors, new MultiHostInjector[0], allInjectors);
    cachedInjectors = result;
    return result;
  }
 @Override
 public void registerMultiHostInjector(@NotNull MultiHostInjector injector) {
   for (Class<? extends PsiElement> place : injector.elementsToInjectIn()) {
     LOG.assertTrue(place != null, injector);
     while (true) {
       MultiHostInjector[] injectors = this.injectors.get(place);
       if (injectors == null) {
         if (this.injectors.putIfAbsent(place, new MultiHostInjector[] {injector}) == null) break;
       } else {
         MultiHostInjector[] newInfos = ArrayUtil.append(injectors, injector);
         if (this.injectors.replace(place, injectors, newInfos)) break;
       }
     }
   }
   cachedInjectors.clearCache();
 }