[debugger] IDEA-338723 Use chosen thread to extract information about coroutine filter

Prepare to fix suspending behavior while stepping in coroutines

GitOrigin-RevId: 3cddb3bf9bfb2260a0a106da6eb39be6d264b69d
This commit is contained in:
Alexey Merkulov
2024-02-02 19:08:11 +01:00
committed by intellij-monorepo-bot
parent e4a9ba0ae4
commit d4f36c6437
3 changed files with 13 additions and 9 deletions

View File

@@ -6,6 +6,7 @@ import com.intellij.debugger.actions.AsyncStacksToggleAction
import com.intellij.debugger.engine.DebugProcessImpl
import com.intellij.debugger.engine.SuspendContextImpl
import com.intellij.debugger.engine.SuspendManagerUtil
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl
import com.intellij.debugger.jdi.StackFrameProxyImpl
import com.intellij.execution.ui.layout.impl.RunnerContentUi
import com.intellij.execution.ui.layout.impl.RunnerLayoutUiImpl
@@ -54,7 +55,8 @@ class CoroutineStackFrameInterceptor(val project: Project) : StackFrameIntercept
}
override fun extractContinuationFilter(suspendContext: SuspendContextImpl): ContinuationFilter? {
val defaultExecutionContext = suspendContext.executionContext() ?: return null
val frameProxy = suspendContext.getStackFrameProxyImpl() ?: return null
val defaultExecutionContext = DefaultExecutionContext(EvaluationContextImpl(suspendContext, frameProxy))
if (!useContinuationObjectFilter.get(suspendContext.debugProcess, false)) {
val coroutineId = DebugProbesImpl.instance(defaultExecutionContext)?.getCurrentThreadCoroutineId(defaultExecutionContext)
@@ -76,7 +78,7 @@ class CoroutineStackFrameInterceptor(val project: Project) : StackFrameIntercept
suspendContext: SuspendContextImpl,
defaultExecutionContext: DefaultExecutionContext
): ContinuationObjectFilter? {
val frameProxy = suspendContext.frameProxy ?: return null
val frameProxy = suspendContext.getStackFrameProxyImpl() ?: return null
val suspendExitMode = frameProxy.location().getSuspendExitMode()
val continuation = extractContinuation(suspendExitMode, frameProxy) ?: return null
@@ -108,6 +110,9 @@ class CoroutineStackFrameInterceptor(val project: Project) : StackFrameIntercept
}
}
private fun SuspendContextImpl.getStackFrameProxyImpl(): StackFrameProxyImpl? =
activeExecutionStack?.threadProxy?.frame(0) ?: this.frameProxy
private data class ContinuationIdFilter(val id: Long) : ContinuationFilter
// Is used when there is no debug information about unique Continuation ID (for example, for the old versions)