@Override
    @Nullable
    public @Nls String getDocumentation() {
      PsiElement element = getElement(true);
      if (element == null) {
        return null;
      }
      provider = ReadAction.compute(() -> getProviderFromElement(element, originalElement));
      LOG.debug("Using provider ", provider);

      if (provider instanceof ExternalDocumentationProvider) {
        List<String> urls = ReadAction.nonBlocking(
          () -> {
            SmartPsiElementPointer<?> originalElementPtr = element.getUserData(ORIGINAL_ELEMENT_KEY);
            PsiElement originalElement = originalElementPtr != null ? originalElementPtr.getElement() : null;
            return provider.getUrlFor(element, originalElement);
          }
        ).executeSynchronously();
        LOG.debug("External documentation URLs: ", urls);
        if (urls != null) {
          for (String url : urls) {
            String doc = ((ExternalDocumentationProvider)provider).fetchExternalDocumentation(
              project, element, Collections.singletonList(url), onHover);
            if (doc != null) {
              LOG.debug("Fetched documentation from ", url);
              effectiveUrl = url;
              return doc;
            }
          }
        }
      }

      //noinspection HardCodedStringLiteral T should be inferred to `@Nls String`
      return ReadAction.nonBlocking(() -> doGetDocumentation(element)).executeSynchronously();
    }
@Override
    @Nullable
    public @Nls String getDocumentation()