private void processStepEvent(SuspendContextImpl suspendContext, StepEvent event) {
    logSuspendContext(suspendContext, "process step event");
    final ThreadReference thread = event.thread();
    //LOG.assertTrue(thread.isSuspended());
    preprocessEvent(suspendContext, thread);

    RequestHint hint = getRequestHint(event);
    Object commandToken = getCommandToken(event);

    deleteStepRequests(event.thread());

    boolean shouldResume = false;

    final Project project = getProject();
    while (true) {
      if (hint != null) {
        final RequestHint currentHint = hint;
        final Ref<Integer> stepDepth = Ref.create();
        long timeMs = TimeoutUtil.measureExecutionTime(() -> stepDepth.set(currentHint.getNextStepDepth(suspendContext)));
        StatisticsStorage.addStepping(this, commandToken, timeMs);

        final int nextStepDepth = stepDepth.get();
        logSuspendContext(suspendContext, "nextStepDepth is " + nextStepDepth);
        if (nextStepDepth == RequestHint.RESUME) {
          getSession().clearSteppingThrough();
          shouldResume = true;
        }
        else if (nextStepDepth == RequestHint.STOP) {
          if (hint.getParentHint() != null) {
            hint = hint.getParentHint();
            continue;
          }
        }
        else {
          final ThreadReferenceProxyImpl threadProxy = suspendContext.getEventThread();
          hint.doStep(this, suspendContext, threadProxy, hint.getSize(), nextStepDepth, commandToken);
          shouldResume = true;
        }

        if (!shouldResume && hint.isRestoreBreakpoints()) {
          DebuggerManagerEx.getInstanceEx(project).getBreakpointManager().enableBreakpoints(this);
        }
      }

      if (shouldResume) {
        getSuspendManager().voteResume(suspendContext);
      }
      else {
        StatisticsStorage.stepRequestCompleted(this, commandToken);
        showStatusText("");
        stopWatchingMethodReturn();
        getSuspendManager().voteSuspend(suspendContext);
        if (hint != null) {
          final MethodFilter methodFilter = hint.getMethodFilter();
          if (methodFilter instanceof NamedMethodFilter namedMethodFilter && !hint.wasStepTargetMethodMatched()) {
            String methodName = namedMethodFilter.getMethodName();
            String message = JavaDebuggerBundle.message("notification.method.has.not.been.called", methodName);
            XDebuggerManagerImpl.getNotificationGroup().createNotification(message, MessageType.INFO).notify(project);
            DebuggerStatistics.logMethodSkippedDuringStepping(project, StatisticsStorage.getSteppingStatisticOrNull(commandToken));
          }
          if (hint.wasStepTargetMethodMatched()) {
            suspendContext.getDebugProcess().resetIgnoreSteppingFilters(event.location(), hint);
          }
        }
      }
      return;
    }
  }
private void processStepEvent(SuspendContextImpl suspendContext, StepEvent event)