private static void dumpActionUpdateThreads(@NotNull Set<String> nonUniqueClasses) {
    ActionManagerImpl actionManager = (ActionManagerImpl)ActionManager.getInstance();
    int[] actionUpdateThreadCounts = new int[ActionUpdateThread.values().length];
    List<String> oldEdtActionNames = new ArrayList<>();
    for (Iterator<AnAction> it = actionManager.actions(false).iterator(); it.hasNext(); ) {
      AnAction action = it.next();
      if (action.getClass() == DefaultActionGroup.class) {
        continue;
      }


      ActionUpdateThread updateThread = action.getActionUpdateThread();
      actionUpdateThreadCounts[updateThread.ordinal()]++;
      if (updateThread == ActionUpdateThread.OLD_EDT) {
        String className = action.getClass().getName();
        String actionIdIfNeeded = nonUniqueClasses.contains(className) ? " (" + actionManager.getId(action) + ")" : "";
        String actionName = className + actionIdIfNeeded;
        oldEdtActionNames.add(actionName);
      }
    }
    List<String> oldEdtExtensions = new ArrayList<>();
    ExtensionsAreaImpl extensionArea = (ExtensionsAreaImpl)ApplicationManager.getApplication().getExtensionArea();
    //noinspection TestOnlyProblems
    extensionArea.processExtensionPoints(ep -> {
      try {
        if (ActionUpdateThreadAware.class.isAssignableFrom(ep.getExtensionClass())) {
          //noinspection unchecked
          List<ActionUpdateThreadAware> extensions = (List<ActionUpdateThreadAware>)ep.getExtensionList();
          for (ActionUpdateThreadAware extension : extensions) {
            ActionUpdateThread updateThread = extension.getActionUpdateThread();
            if (updateThread == ActionUpdateThread.OLD_EDT) {
              oldEdtExtensions.add(extension.getClass().getName());
            }
          }
        }
      }
      catch (Throwable e) {
        LOG.warn(e);
      }
      return Unit.INSTANCE;
    });

    StringBuilder sb = new StringBuilder();
    sb.append("---- action-update-thread stats ----\n");
    sb.append(StringUtil.join(ActionUpdateThread.values(), t -> actionUpdateThreadCounts[t.ordinal()] + ":" + t.name(), ", "));
    if (!oldEdtActionNames.isEmpty()) {
      sb.append("... see the list of registered OLD_EDT actions below:");
      oldEdtActionNames.sort(String::compareTo);
      for (String name : oldEdtActionNames) {
        sb.append("\n").append(name);
      }
      sb.append("\n");
    }
    if (!oldEdtExtensions.isEmpty()) {
      sb.append("\n... and ").append(oldEdtExtensions.size()).append(" OLD_EDT extensions:");
      oldEdtExtensions.sort(String::compareTo);
      for (String name : oldEdtExtensions) {
        sb.append("\n").append(name);
      }
      sb.append("\n");
    }
    LOG.info(sb.toString());
  }
private static void dumpActionUpdateThreads(@NotNull Set<String> nonUniqueClasses)