private void notifySkippedBreakpoints(@Nullable LocatableEvent event, SkippedBreakpointReason reason) {
    if (event == null) return;

    // IDE user is not intended to see notifications about our synthetic breakpoints.
    final LocatableEventRequestor requestor = (LocatableEventRequestor)RequestManagerImpl.findRequestor(event.request());
    if (requestor instanceof SyntheticBreakpoint) return;

    DebuggerStatistics.logBreakpointSkipped(getProject(), reason);

    if (!myNotificationsCoolDown.compareAndSet(false, true)) return;

    AppExecutorUtil.getAppScheduledExecutorService().schedule(() -> myNotificationsCoolDown.set(false), 1, TimeUnit.SECONDS);
    var message = switch (reason) {
      case EVALUATION_IN_ANOTHER_THREAD,
           EVALUATION_IN_THE_SAME_THREAD -> JavaDebuggerBundle.message("message.breakpoint.skipped.during.evaluation", event.location());
      case OTHER_VM -> JavaDebuggerBundle.message("message.breakpoint.skipped.other.vm", event.location());
      case STEPPING -> JavaDebuggerBundle.message("message.breakpoint.skipped.during.stepping.in.another.thread", event.location());
    };
    XDebuggerManagerImpl.getNotificationGroup()
      .createNotification(message, MessageType.WARNING)
      .addAction(NotificationAction.createSimpleExpiring(JavaDebuggerBundle.message("message.breakpoint.skipped.learn.more"), () -> {
        BrowserUtil.browse("https://www.jetbrains.com/help/idea/?skipped.breakpoints");
      }))
      .notify(getProject());
  }
private void notifySkippedBreakpoints(@Nullable LocatableEvent event, SkippedBreakpointReason reason)