@NotNull
  Promise<Void> select(@NotNull VirtualFile virtualFile) {
    List<ServiceViewItem> selectedItems = new SmartList<>();
    for (ServiceViewContentHolder contentHolder : myContentHolders) {
      Content content = contentHolder.contentManager.getSelectedContent();
      if (content == null) continue;

      ServiceView serviceView = getServiceView(content);
      if (serviceView == null) continue;

      List<ServiceViewItem> items = serviceView.getSelectedItems();
      ContainerUtil.addIfNotNull(selectedItems, ContainerUtil.getOnlyItem(items));
    }

    AsyncPromise<Void> result = new AsyncPromise<>();
    myModel.getInvoker().invoke(() -> {
      Condition<? super ServiceViewItem> fileCondition = item -> {
        ServiceViewDescriptor descriptor = item.getViewDescriptor();
        return descriptor instanceof ServiceViewLocatableDescriptor &&
               virtualFile.equals(((ServiceViewLocatableDescriptor)descriptor).getVirtualFile());
      };

      // Multiple services may target to one virtual file.
      // Do nothing if service, targeting to the given virtual file, is selected,
      // otherwise it may lead to jumping selection,
      // if editor have just been selected due to some service selection.
      if (ContainerUtil.find(selectedItems, fileCondition) != null) {
        result.setResult(null);
        return;
      }

      ServiceViewItem fileItem = myModel.findItem(
        item -> !(item instanceof ServiceModel.ServiceNode) ||
                item.getViewDescriptor() instanceof ServiceViewLocatableDescriptor,
        fileCondition
      );
      if (fileItem != null) {
        Promise<Void> promise = doSelect(fileItem.getValue(), fileItem.getRootContributor().getClass(), false, false);
        promise.processed(result);
      }
    });
    return result;
  }
@NotNull
  Promise<Void> select(@NotNull VirtualFile virtualFile)