in src/main/java/com/intellij/rt/debugger/agent/CaptureAgent.java [543:618]
static {
addCapture("java/awt/event/InvocationEvent", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("java/awt/event/InvocationEvent", "dispatch", THIS_KEY_PROVIDER);
addCapture("java/lang/Thread", "start", THIS_KEY_PROVIDER);
addInsert("java/lang/Thread", "run", THIS_KEY_PROVIDER);
addCapture("java/util/concurrent/FutureTask", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("java/util/concurrent/FutureTask", "run", THIS_KEY_PROVIDER);
addInsert("java/util/concurrent/FutureTask", "runAndReset", THIS_KEY_PROVIDER);
addCapture("java/util/concurrent/CompletableFuture$AsyncSupply", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("java/util/concurrent/CompletableFuture$AsyncSupply", "run", THIS_KEY_PROVIDER);
addCapture("java/util/concurrent/CompletableFuture$AsyncRun", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("java/util/concurrent/CompletableFuture$AsyncRun", "run", THIS_KEY_PROVIDER);
// CompletableFuture instrumentation:
// handle every Completion subclass that invokes some callback (and not another future).
for (String completionClass : new String[]{
// Last updated for JDK 23.
"UniApply", "UniAccept", "UniRun",
"UniWhenComplete", "UniHandle", "UniExceptionally",
"UniComposeExceptionally", "UniCompose",
"BiApply", "BiAccept", "BiRun",
"OrApply", "OrAccept", "OrRun",
}) {
addCapture("java/util/concurrent/CompletableFuture$" + completionClass, CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("java/util/concurrent/CompletableFuture$" + completionClass, "tryFire", THIS_KEY_PROVIDER);
}
addCapture("java/util/concurrent/ForkJoinTask", "fork", THIS_KEY_PROVIDER);
addInsert("java/util/concurrent/ForkJoinTask", "doExec", THIS_KEY_PROVIDER);
// netty
addCapture("io/netty/util/concurrent/SingleThreadEventExecutor", "addTask", FIRST_PARAM);
addInsert("io/netty/util/concurrent/AbstractEventExecutor", "safeExecute", FIRST_PARAM);
// scala
addCapture("scala/concurrent/impl/Future$PromiseCompletingRunnable", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("scala/concurrent/impl/Future$PromiseCompletingRunnable", "run", THIS_KEY_PROVIDER);
addCapture("scala/concurrent/impl/CallbackRunnable", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("scala/concurrent/impl/CallbackRunnable", "run", THIS_KEY_PROVIDER);
addCapture("scala/concurrent/impl/Promise$Transformation", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("scala/concurrent/impl/Promise$Transformation", "run", THIS_KEY_PROVIDER);
// akka-scala
addCapture("akka/actor/ScalaActorRef", "$bang", FIRST_PARAM);
addCapture("akka/actor/RepointableActorRef", "$bang", FIRST_PARAM);
addCapture("akka/actor/LocalActorRef", "$bang", FIRST_PARAM);
addCapture("akka/actor/ActorRef", "$bang", FIRST_PARAM);
addInsert("akka/actor/Actor$class", "aroundReceive", param(2));
addInsert("akka/actor/ActorCell", "receiveMessage", FIRST_PARAM);
// JavaFX
addCapture("com/sun/glass/ui/InvokeLaterDispatcher", "invokeLater", FIRST_PARAM);
addInsert("com/sun/glass/ui/InvokeLaterDispatcher$Future", "run",
new FieldKeyProvider("com/sun/glass/ui/InvokeLaterDispatcher$Future", "runnable"));
if (Boolean.getBoolean("debugger.agent.enable.coroutines")) {
if (!Boolean.getBoolean("kotlinx.coroutines.debug.enable.creation.stack.trace")) {
// Kotlin coroutines
addCapture("kotlinx/coroutines/debug/internal/DebugProbesImpl$CoroutineOwner", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("kotlin/coroutines/jvm/internal/BaseContinuationImpl", "resumeWith", new CoroutineOwnerKeyProvider());
}
if (Boolean.getBoolean("kotlinx.coroutines.debug.enable.flows.stack.trace")) {
// Flows
addCapture("kotlinx/coroutines/flow/internal/FlowValueWrapperInternal", CONSTRUCTOR, THIS_KEY_PROVIDER);
addInsert("kotlinx/coroutines/flow/internal/FlowValueWrapperInternalKt", "emitInternal", param(1));
addInsert("kotlinx/coroutines/flow/internal/FlowValueWrapperInternalKt", "debuggerCapture", FIRST_PARAM);
}
}
}