void (@NotNull DebuggerContextImpl newContext, DebuggerSession.Event event) { if (event == DebuggerSession.Event.DISPOSE) { Disposer.dispose(this); return; } if (myMode == NONE) return; if (event == DebuggerSession.Event.DETACHED) { cleanUp(); return; } if (event == DebuggerSession.Event.RESUME) { cancelComputation(); myScheduledCleanup = EdtScheduledExecutorService.getInstance().schedule(this::cleanUp, CLEANUP_DELAY_MILLIS, TimeUnit.MILLISECONDS); } if (event != DebuggerSession.Event.PAUSE && event != DebuggerSession.Event.REFRESH) { return; } SourcePosition sourcePosition = newContext.getSourcePosition(); if (sourcePosition == null) { cleanUp(); return; } DfaAssistProvider provider = DfaAssistProvider.EP_NAME.forLanguage(sourcePosition.getFile().getLanguage()); DebugProcessImpl debugProcess = newContext.getDebugProcess(); PsiElement element = sourcePosition.getElementAt(); if (debugProcess == null || provider == null || element == null) { cleanUp(); return; } SmartPsiElementPointer<PsiElement> pointer = SmartPointerManager.createPointer(element); debugProcess.getManagerThread().schedule(new SuspendContextCommandImpl(newContext.getSuspendContext()) { @Override public void contextAction(@NotNull SuspendContextImpl suspendContext) { StackFrameProxyImpl proxy = suspendContext.getFrameProxy(); if (proxy == null) { cleanUp(); return; } DebuggerDfaRunner.Pupa runnerPupa = makePupa(proxy, pointer); if (runnerPupa == null) { cleanUp(); return; } myComputation = ReadAction.nonBlocking(() -> { DebuggerDfaRunner runner = runnerPupa.transform(); return runner == null ? DfaResult.EMPTY : runner.computeHints(); }) .withDocumentsCommitted(myProject) .coalesceBy(DfaAssist.this) .finishOnUiThread(ModalityState.nonModal(), hints -> DfaAssist.this.displayInlays(hints)) .submit(AppExecutorUtil.getAppExecutorService()); } }); }