diff --git a/java/debugger/backend/src/com/intellij/java/debugger/impl/backend/BackendJavaDebuggerSessionApi.kt b/java/debugger/backend/src/com/intellij/java/debugger/impl/backend/BackendJavaDebuggerSessionApi.kt
index 4e36fc7f964a..959e05039c39 100644
--- a/java/debugger/backend/src/com/intellij/java/debugger/impl/backend/BackendJavaDebuggerSessionApi.kt
+++ b/java/debugger/backend/src/com/intellij/java/debugger/impl/backend/BackendJavaDebuggerSessionApi.kt
@@ -1,17 +1,15 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.java.debugger.impl.backend
-import com.intellij.debugger.actions.FreezeThreadAction
-import com.intellij.debugger.actions.InterruptThreadAction
-import com.intellij.debugger.actions.ThreadDumpAction
+import com.intellij.debugger.actions.*
import com.intellij.debugger.engine.AsyncStacksUtils
import com.intellij.debugger.engine.JavaDebugProcess
import com.intellij.debugger.engine.JavaExecutionStack
import com.intellij.debugger.engine.executeOnDMT
import com.intellij.execution.filters.ExceptionFilters
import com.intellij.ide.ui.icons.rpcId
-import com.intellij.debugger.actions.ResumeThreadAction
import com.intellij.java.debugger.impl.shared.rpc.*
+import com.intellij.openapi.application.EDT
import com.intellij.platform.debugger.impl.rpc.toRpc
import com.intellij.unscramble.CompoundDumpItem
import com.intellij.unscramble.DumpItem
@@ -19,13 +17,10 @@ import com.intellij.xdebugger.impl.rpc.XDebugSessionId
import com.intellij.xdebugger.impl.rpc.XExecutionStackId
import com.intellij.xdebugger.impl.rpc.models.findValue
import fleet.util.channels.use
-import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.ReceiveChannel
import kotlinx.coroutines.channels.produce
-import kotlinx.coroutines.launch
internal class BackendJavaDebuggerSessionApi : JavaDebuggerSessionApi {
@OptIn(ExperimentalCoroutinesApi::class)
@@ -64,6 +59,13 @@ internal class BackendJavaDebuggerSessionApi : JavaDebuggerSessionApi {
AsyncStacksUtils.setAsyncStacksEnabled(session, state)
}
+ override suspend fun stepOutOfCodeBlock(sessionId: XDebugSessionId) {
+ val xSession = sessionId.findValue() ?: return
+ withContext(Dispatchers.EDT) {
+ StepOutOfBlockActionUtils.stepOutOfBlock(xSession)
+ }
+ }
+
override suspend fun resumeThread(executionStackId: XExecutionStackId) {
invokeThreadCommand(executionStackId, ThreadCommand.RESUME)
}
diff --git a/java/debugger/impl/resources/META-INF/java-debugger.xml b/java/debugger/impl/resources/META-INF/java-debugger.xml
index 7968cbfc7db7..36c6f5703d37 100644
--- a/java/debugger/impl/resources/META-INF/java-debugger.xml
+++ b/java/debugger/impl/resources/META-INF/java-debugger.xml
@@ -288,12 +288,6 @@
-
-
-
-
-
diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/StepOutOfBlockAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/StepOutOfBlockActionUtils.java
similarity index 74%
rename from java/debugger/impl/src/com/intellij/debugger/actions/StepOutOfBlockAction.java
rename to java/debugger/impl/src/com/intellij/debugger/actions/StepOutOfBlockActionUtils.java
index 77259f377e08..5531ac25db49 100644
--- a/java/debugger/impl/src/com/intellij/debugger/actions/StepOutOfBlockAction.java
+++ b/java/debugger/impl/src/com/intellij/debugger/actions/StepOutOfBlockActionUtils.java
@@ -7,11 +7,8 @@ import com.intellij.debugger.engine.JavaDebugProcess;
import com.intellij.debugger.engine.MethodFilter;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.impl.DebuggerSession;
-import com.intellij.openapi.actionSystem.ActionUpdateThread;
-import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
-import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiCodeBlock;
import com.intellij.psi.PsiElement;
@@ -21,21 +18,13 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Range;
import com.intellij.xdebugger.XDebugProcess;
import com.intellij.xdebugger.XDebugSession;
-import com.intellij.xdebugger.impl.XDebugSessionImpl;
-import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
import com.sun.jdi.Location;
import com.sun.jdi.request.StepRequest;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.TestOnly;
-public class StepOutOfBlockAction extends DebuggerAction implements DumbAware {
- @Override
- public void actionPerformed(@NotNull AnActionEvent e) {
- XDebugSession session = DebuggerUIUtil.getSession(e);
- if (session != null) {
- doStepOutOfBlock(session);
- }
- }
+@ApiStatus.Internal
+public final class StepOutOfBlockActionUtils {
private static void doStepOutOfBlock(@NotNull XDebugSession xSession) {
XDebugProcess process = xSession.getDebugProcess();
@@ -65,23 +54,11 @@ public class StepOutOfBlockAction extends DebuggerAction implements DumbAware {
xSession.stepOut();
}
- @TestOnly
+ @ApiStatus.Internal
public static void stepOutOfBlock(@NotNull XDebugSession xSession) {
doStepOutOfBlock(xSession);
}
- @Override
- public void update(@NotNull AnActionEvent e) {
- XDebugSession session = DebuggerUIUtil.getSession(e);
- e.getPresentation().setEnabledAndVisible(session != null && session.getDebugProcess() instanceof JavaDebugProcess &&
- !((XDebugSessionImpl)session).isReadOnly() && session.isSuspended());
- }
-
- @Override
- public @NotNull ActionUpdateThread getActionUpdateThread() {
- return ActionUpdateThread.BGT;
- }
-
private static final class BlockFilter implements MethodFilter {
private final Range myLines;
diff --git a/java/debugger/shared/resources/intellij.java.debugger.impl.shared.xml b/java/debugger/shared/resources/intellij.java.debugger.impl.shared.xml
index 24ff3062d469..abfd5a3608aa 100644
--- a/java/debugger/shared/resources/intellij.java.debugger.impl.shared.xml
+++ b/java/debugger/shared/resources/intellij.java.debugger.impl.shared.xml
@@ -22,6 +22,11 @@
+
+
+
+
diff --git a/java/debugger/shared/resources/messages/JavaDebuggerSharedBundle.properties b/java/debugger/shared/resources/messages/JavaDebuggerSharedBundle.properties
index 7ea1017dc75a..e0d39efe5e27 100644
--- a/java/debugger/shared/resources/messages/JavaDebuggerSharedBundle.properties
+++ b/java/debugger/shared/resources/messages/JavaDebuggerSharedBundle.properties
@@ -9,4 +9,5 @@ action.resume.thread.text=Resume
action.freeze.thread.text=Freeze
action.Debugger.XThreadsView.ResumeThread.text=Resume
action.Debugger.XThreadsView.FreezeThread.text=Freeze
-action.Debugger.XThreadsView.InterruptThread.text=Interrupt
\ No newline at end of file
+action.Debugger.XThreadsView.InterruptThread.text=Interrupt
+action.Debugger.StepOutOfBlock.text=Step Out of Code Block
\ No newline at end of file
diff --git a/java/debugger/shared/src/com/intellij/java/debugger/impl/shared/actions/StepOutOfBlockAction.kt b/java/debugger/shared/src/com/intellij/java/debugger/impl/shared/actions/StepOutOfBlockAction.kt
new file mode 100644
index 000000000000..8368d888b7c6
--- /dev/null
+++ b/java/debugger/shared/src/com/intellij/java/debugger/impl/shared/actions/StepOutOfBlockAction.kt
@@ -0,0 +1,36 @@
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.java.debugger.impl.shared.actions
+
+import com.intellij.java.debugger.impl.shared.SharedJavaDebuggerManager
+import com.intellij.java.debugger.impl.shared.rpc.JavaDebuggerSessionApi
+import com.intellij.openapi.actionSystem.ActionUpdateThread
+import com.intellij.openapi.actionSystem.AnAction
+import com.intellij.openapi.actionSystem.AnActionEvent
+import com.intellij.openapi.actionSystem.remoting.ActionRemoteBehaviorSpecification
+import com.intellij.openapi.project.DumbAware
+import com.intellij.xdebugger.impl.ui.DebuggerUIUtil
+import kotlinx.coroutines.launch
+
+private class StepOutOfBlockAction : AnAction(), DumbAware, ActionRemoteBehaviorSpecification.FrontendOtherwiseBackend {
+ override fun actionPerformed(e: AnActionEvent) {
+ val sessionProxy = DebuggerUIUtil.getSessionProxy(e) ?: return
+ sessionProxy.coroutineScope.launch {
+ JavaDebuggerSessionApi.getInstance().stepOutOfCodeBlock(sessionProxy.id)
+ }
+ }
+
+ override fun update(e: AnActionEvent) {
+ val sessionProxy = DebuggerUIUtil.getSessionProxy(e)
+ val project = e.project
+ if (sessionProxy == null || project == null) {
+ e.presentation.isEnabledAndVisible = false
+ return
+ }
+ val javaSession = SharedJavaDebuggerManager.getInstance(project).getJavaSession(sessionProxy.id)
+ e.presentation.isEnabledAndVisible = javaSession != null && !sessionProxy.isReadOnly && sessionProxy.isSuspended
+ }
+
+ override fun getActionUpdateThread(): ActionUpdateThread {
+ return ActionUpdateThread.BGT
+ }
+}
diff --git a/java/debugger/shared/src/com/intellij/java/debugger/impl/shared/rpc/JavaDebuggerSessionApi.kt b/java/debugger/shared/src/com/intellij/java/debugger/impl/shared/rpc/JavaDebuggerSessionApi.kt
index 37ccea4fe82c..d9a2f5f6770b 100644
--- a/java/debugger/shared/src/com/intellij/java/debugger/impl/shared/rpc/JavaDebuggerSessionApi.kt
+++ b/java/debugger/shared/src/com/intellij/java/debugger/impl/shared/rpc/JavaDebuggerSessionApi.kt
@@ -32,6 +32,8 @@ interface JavaDebuggerSessionApi : RemoteApi {
suspend fun interruptThread(executionStackId: XExecutionStackId)
+ suspend fun stepOutOfCodeBlock(sessionId: XDebugSessionId)
+
companion object {
@JvmStatic
suspend fun getInstance(): JavaDebuggerSessionApi {
diff --git a/platform/platform-resources-en/src/messages/ActionsBundle.properties b/platform/platform-resources-en/src/messages/ActionsBundle.properties
index ce381eca7611..7322fe100177 100644
--- a/platform/platform-resources-en/src/messages/ActionsBundle.properties
+++ b/platform/platform-resources-en/src/messages/ActionsBundle.properties
@@ -314,7 +314,6 @@ action.Actions.ActionsPlugin.GenerateToString.description=Generate toString() me
action.Debugger.ShowRelatedStack.text=Show related stack\u2026
action.Debugger.ShowTypes.text=Show types
action.Debugger.AddSteppingFilter.text=Add Stepping Filter\u2026
-action.Debugger.StepOutOfBlock.text=Step Out of Code Block
action.Debugger.CreateRenderer.text=Create\u2026
action.Debugger.CreateRenderer.XDebuggerTreePopup.text=Create Renderer
action.Debugger.XDebuggerTextPopup.ShowAsObject.text=Show as Object