From 865332c8731c17a6bef40b68c9cf7ef1cc409583 Mon Sep 17 00:00:00 2001 From: Maria Sokolova Date: Thu, 31 Jul 2025 18:01:55 +0200 Subject: [PATCH] [rd debugger] New splitted FreezeThreadAction based on XDebuggerTree (RPC) IJPL-199588 GitOrigin-RevId: efa58ccba991bb3eaced63acdd4786058f1dc5ec --- .../backend/BackendJavaDebuggerSessionApi.kt | 8 +++ .../messages/JavaDebuggerBundle.properties | 3 +- .../intellij.java.debugger.impl.shared.xml | 3 ++ .../JavaDebuggerSharedBundle.properties | 4 +- .../impl/shared/actions/FreezeThreadAction.kt | 50 +++++++++++++++++++ .../impl/shared/rpc/JavaDebuggerSessionApi.kt | 2 + .../src/idea/XDebuggerActions.xml | 8 ++- 7 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 java/debugger/shared/src/com/intellij/java/debugger/impl/shared/actions/FreezeThreadAction.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 7a51c39d6dd1..92d79c53221b 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 @@ -67,6 +67,10 @@ internal class BackendJavaDebuggerSessionApi : JavaDebuggerSessionApi { invokeThreadCommand(executionStackId, ThreadCommand.RESUME) } + override suspend fun freezeThread(executionStackId: XExecutionStackId) { + invokeThreadCommand(executionStackId, ThreadCommand.FREEZE) + } + private fun invokeThreadCommand(executionStackId: XExecutionStackId, command: ThreadCommand) { val executionStackModel = executionStackId.findValue() ?: return val xSession = executionStackModel.session @@ -83,8 +87,12 @@ internal class BackendJavaDebuggerSessionApi : JavaDebuggerSessionApi { ThreadCommand.RESUME -> { ResumeThreadAction.resumeThread(threadProxy, debugProcess, managerThread) } + ThreadCommand.FREEZE -> { + FreezeThreadAction.freezeThread(threadProxy, debugProcess, managerThread) + } } } + companion object { private enum class ThreadCommand { FREEZE, RESUME } } diff --git a/java/debugger/openapi/resources/messages/JavaDebuggerBundle.properties b/java/debugger/openapi/resources/messages/JavaDebuggerBundle.properties index 975f87d91cc6..e22959e6e754 100644 --- a/java/debugger/openapi/resources/messages/JavaDebuggerBundle.properties +++ b/java/debugger/openapi/resources/messages/JavaDebuggerBundle.properties @@ -37,7 +37,8 @@ button.drop.anyway=Do Not Execute button.execute.finally=Execute Finally Blocks drop.frame.error.no.information=Information about the frame is not available progress.evaluating=Evaluating {0} -action.resume.thread.text.resume=Resume +action.resume.thread.text=Resume +action.freeze.thread.text=Freeze action.interrupt.thread.text=Interrupt title.set.value=Set Value warning.recalculate=The value will be recalculated 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 9f252ab52d42..f754e3fc1f0a 100644 --- a/java/debugger/shared/resources/intellij.java.debugger.impl.shared.xml +++ b/java/debugger/shared/resources/intellij.java.debugger.impl.shared.xml @@ -25,6 +25,9 @@ + + + > + JavaDebuggerSessionApi.getInstance().freezeThread(xExecutionStackId) + } + sessionProxy.rebuildViews() + } + + } + + override fun update(e: AnActionEvent) { + val selectedNodes = getSelectedNodes(e.dataContext) + e.presentation.apply { + isEnabledAndVisible = false + if (DebuggerUIUtil.getSessionProxy(e) == null) { + return + } + if (selectedNodes.isNotEmpty() && selectedNodes.all { it.isNotSuspendedJavaThread() }) { + text = JavaDebuggerSharedBundle.message("action.freeze.thread.text") + isEnabledAndVisible = true + } + } + } + + override fun getActionUpdateThread(): ActionUpdateThread { + return ActionUpdateThread.EDT + } +} 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 7e3093150f0b..0e92f04385be 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 @@ -28,6 +28,8 @@ interface JavaDebuggerSessionApi : RemoteApi { suspend fun resumeThread(executionStackId: XExecutionStackId) + suspend fun freezeThread(executionStackId: XExecutionStackId) + companion object { @JvmStatic suspend fun getInstance(): JavaDebuggerSessionApi { diff --git a/platform/platform-resources/src/idea/XDebuggerActions.xml b/platform/platform-resources/src/idea/XDebuggerActions.xml index 1b91b2c3d015..478c080c29db 100644 --- a/platform/platform-resources/src/idea/XDebuggerActions.xml +++ b/platform/platform-resources/src/idea/XDebuggerActions.xml @@ -3,6 +3,9 @@ + + + @@ -120,6 +123,7 @@ + @@ -195,9 +199,9 @@ - + - +