static

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);
      }
    }
  }