@RequiresBackgroundThread
  private static void checkChainsExistenceInBackground(@NotNull PsiElement elementAtDebugger,
                                                       @NotNull ChainsSearchResult searchResult,
                                                       @NotNull ExecutorService executor) {
    List<LibrarySupportProvider> extensions = forLanguage(elementAtDebugger.getLanguage());
    if (extensions.isEmpty()) {
      searchResult.markUnsupportedLanguage();
    }
    else {
      ReadAction.nonBlocking(() -> {
          boolean found = false;
          for (LibrarySupportProvider provider : extensions) {
            try {
              if (provider.getChainBuilder().isChainExists(elementAtDebugger)) {
                found = true;
                break;
              }
            }
            catch (ProcessCanceledException e) {
              throw e;
            }
            catch (PsiInvalidElementAccessException ignored) {
            }
            catch (Throwable e) {
              LOG.error(e);
            }
          }
          if (LOG.isDebugEnabled()) {
            LOG.debug("Chains found:" + found);
          }
          searchResult.updateStatus(found);
        })
        .inSmartMode(elementAtDebugger.getProject())
        .executeSynchronously();
    }
  }
@RequiresBackgroundThread
  private static void checkChainsExistenceInBackground(@NotNull PsiElement elementAtDebugger,
                                                       @NotNull ChainsSearchResult searchResult,
                                                       @NotNull ExecutorService executor)