private static void highlightInjectedBackground(@NotNull PsiFile injectedPsi,
                                                  @NotNull List<? extends PsiLanguageInjectionHost.Shred> places,
                                                  @Nullable TextAttributesKey attributesKey,
                                                  @NotNull TriConsumer<Object, ? super PsiElement, ? super List<? extends HighlightInfo>> resultSink) {
    boolean addTooltips = places.size() < 100;
    List<HighlightInfo> result = new ArrayList<>(places.size());
    for (PsiLanguageInjectionHost.Shred place : places) {
      PsiLanguageInjectionHost host = place.getHost();
      if (host == null) continue;
      TextRange textRange = place.getRangeInsideHost().shiftRight(host.getTextRange().getStartOffset());
      if (textRange.isEmpty()) continue;
      HighlightInfo.Builder builder = HighlightInfo.newHighlightInfo(HighlightInfoType.INJECTED_LANGUAGE_BACKGROUND).range(textRange);
      if (attributesKey != null && InjectedLanguageUtil.isHighlightInjectionBackground(host)) {
        builder.textAttributes(attributesKey);
      }
      if (addTooltips) {
        String desc = injectedPsi.getLanguage().getDisplayName() + ": " + injectedPsi.getText();
        builder.unescapedToolTip(desc);
      }
      HighlightInfo info = builder.createUnconditionally();
      info.markFromInjection();
      result.add(info);
    }
    resultSink.accept(INJECTION_BACKGROUND_ID, injectedPsi, result);
  }
private static void highlightInjectedBackground(@NotNull PsiFile injectedPsi,
                                                  @NotNull List<? extends PsiLanguageInjectionHost.Shred> places,
                                                  @Nullable TextAttributesKey attributesKey,
                                                  @NotNull TriConsumer<Object, ? super PsiElement, ? super List<? extends HighlightInfo>> resultSink)