From 6de58d66848202b5196a2a54b62f99f37c09db9f Mon Sep 17 00:00:00 2001 From: Maksim Zuev Date: Thu, 14 Aug 2025 17:37:28 +0200 Subject: [PATCH] [rd debugger] IDEA-377609 Move step out of code block to frontend GitOrigin-RevId: 7dcc5bce46a36ce569f841cfd3292afb829b26ba --- .../backend/BackendJavaDebuggerSessionApi.kt | 18 +++++----- .../impl/resources/META-INF/java-debugger.xml | 6 ---- ...on.java => StepOutOfBlockActionUtils.java} | 31 +++------------- .../intellij.java.debugger.impl.shared.xml | 5 +++ .../JavaDebuggerSharedBundle.properties | 3 +- .../shared/actions/StepOutOfBlockAction.kt | 36 +++++++++++++++++++ .../impl/shared/rpc/JavaDebuggerSessionApi.kt | 2 ++ .../src/messages/ActionsBundle.properties | 1 - 8 files changed, 59 insertions(+), 43 deletions(-) rename java/debugger/impl/src/com/intellij/debugger/actions/{StepOutOfBlockAction.java => StepOutOfBlockActionUtils.java} (74%) create mode 100644 java/debugger/shared/src/com/intellij/java/debugger/impl/shared/actions/StepOutOfBlockAction.kt 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