void (@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 || !editor.getContentComponent().isShowing()) { 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()); }