private void showInfoTooltip(@NotNull EditorMouseEvent e, boolean showImmediately) {
    long startTimestamp = System.currentTimeMillis();
    Editor editor = e.getEditor();
    int targetOffset = getTargetOffset(e);
    if (targetOffset < 0) {
      closeHint();
      return;
    }
    myPreparationTask = ReadAction.nonBlocking(() -> createContext(editor, targetOffset, startTimestamp, showImmediately, true))
      .coalesceBy(this)
      .withDocumentsCommitted(Objects.requireNonNull(editor.getProject()))
      .expireWhen(() -> editor.isDisposed())
      .finishOnUiThread(ModalityState.any(), context -> {
        myPreparationTask = null;
        if (context == null || !UIUtil.isShowing(editor.getContentComponent())) {
          closeHint();
          return;
        }
        Context.Relation relation = isHintShown() ? context.compareTo(myContext) : Context.Relation.DIFFERENT;
        if (relation == Context.Relation.SAME) {
          return;
        }
        else if (relation == Context.Relation.DIFFERENT) {
          closeHint();
        }
        scheduleProcessing(editor, context, relation == Context.Relation.SIMILAR, showImmediately, false);
      })
      .submit(AppExecutorUtil.getAppExecutorService());
  }
private void showInfoTooltip(@NotNull EditorMouseEvent e, boolean showImmediately)