protected @NotNull <E extends PsiElement> String buildTooltipText(@Nullable String prefix,
                                                                    @NotNull Collection<? extends E> elements,
                                                                    @NotNull Function<? super E, String> elementToPrefix,
                                                                    @NotNull Predicate<? super E> skipFirstMemberOfElement,
                                                                    @Nullable String actionId,
                                                                    @NotNull String pressMessageKey) {
    StringBuilder sb = new StringBuilder("<html><body><p>");
    if (prefix != null) sb.append(prefix);
    Set<String> names = new HashSet<>();
    for (E element : elements) {
      StringBuilder elementBuilder = new StringBuilder();
      appendElement(elementBuilder, element, skipFirstMemberOfElement.test(element));
      if (names.add(elementBuilder.toString())) {
        String elementPrefix = elementToPrefix.apply(element);
        if (elementPrefix != null) sb.append(elementPrefix);
        sb.append(elementBuilder);
      }
    }
    appendContextHelp(sb, actionId, pressMessageKey);
    sb.append("</p></body></html>");
    return sb.toString();
  }
protected @NotNull <E extends PsiElement> String buildTooltipText(@Nullable String prefix,
                                                                    @NotNull Collection<? extends E> elements,
                                                                    @NotNull Function<? super E, String> elementToPrefix,
                                                                    @NotNull Predicate<? super E> skipFirstMemberOfElement,
                                                                    @Nullable String actionId,
                                                                    @NotNull String pressMessageKey)