void (SuspendContextImpl suspendContext, StepEvent 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(); 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.getThread(); 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; } }