[rd debugger] IDEA-377734 Move CreateRendererAction to frontend

GitOrigin-RevId: c8135ff2ed1cd2104a5b2325d72a125e99301ce7
This commit is contained in:
Maksim Zuev
2025-08-20 10:54:25 +00:00
committed by intellij-monorepo-bot
parent a1d0e99af3
commit 374d5ccabf
7 changed files with 58 additions and 47 deletions
@@ -1,7 +1,9 @@
// 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.CreateRendererActionUtils
import com.intellij.debugger.engine.JavaDebugProcess
import com.intellij.debugger.engine.JavaValue
import com.intellij.debugger.memory.action.CalculateRetainedSizeActionUtil
import com.intellij.debugger.memory.action.DebuggerTreeAction
import com.intellij.debugger.memory.filtering.ClassInstancesProvider
@@ -35,4 +37,12 @@ internal class BackendJavaDebuggerLuxActionsApi : JavaDebuggerLuxActionsApi {
CalculateRetainedSizeActionUtil.showDialog(xValue, nodeName, process)
}
}
override suspend fun showCreateRendererDialog(xValueId: XValueId) {
val xValueModel = BackendXValueModel.findById(xValueId) ?: return
val javaValue = xValueModel.xValue as? JavaValue ?: return
withContext(Dispatchers.EDT) {
CreateRendererActionUtils.showCreateRendererDialog(javaValue)
}
}
}
@@ -285,11 +285,6 @@
<add-to-group group-id="XDebugger.Frames.Tree.Popup.Frontend"/>
</action>
<action id="Debugger.CreateRenderer" class="com.intellij.debugger.actions.CreateRendererAction">
<add-to-group group-id="XDebugger.Watches.Inline.Popup" anchor="last"/>
<override-text place="XDebuggerTreePopup"/>
</action>
<action id="Debugger.SwitchToTheNextContext" class="com.intellij.debugger.actions.SwitchToTheNextContextAction"/>
<action id="Debugger.CallTracer" class="com.intellij.debugger.ui.breakpoints.CallTracer$CallTracerToggleAction"
icon="AllIcons.Debugger.Db_set_breakpoint">
@@ -2,61 +2,30 @@
package com.intellij.debugger.actions;
import com.intellij.debugger.JavaDebuggerBundle;
import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.JavaValue;
import com.intellij.debugger.engine.SuspendContextImpl;
import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
import com.intellij.debugger.engine.events.SuspendContextCommandImpl;
import com.intellij.debugger.settings.NodeRendererSettings;
import com.intellij.debugger.settings.UserRenderersConfigurable;
import com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.options.ConfigurableBase;
import com.intellij.openapi.options.ex.SingleConfigurableEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
import com.sun.jdi.Type;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class CreateRendererAction extends AnAction {
@Override
public void update(@NotNull AnActionEvent e) {
final List<JavaValue> values = ViewAsGroup.getSelectedValues(e);
if (values.size() != 1) {
e.getPresentation().setEnabledAndVisible(false);
}
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.BGT;
}
@Override
public void actionPerformed(final @NotNull AnActionEvent event) {
final DebuggerContextImpl debuggerContext = DebuggerAction.getDebuggerContext(event.getDataContext());
final List<JavaValue> values = ViewAsGroup.getSelectedValues(event);
if (values.size() != 1) {
return;
}
final JavaValue javaValue = values.get(0);
final DebugProcessImpl process = debuggerContext.getDebugProcess();
if (process == null) {
return;
}
final Project project = event.getProject();
javaValue.getEvaluationContext().getManagerThread().schedule(new DebuggerContextCommandImpl(debuggerContext) {
@ApiStatus.Internal
public final class CreateRendererActionUtils {
public static void showCreateRendererDialog(final JavaValue javaValue) {
EvaluationContextImpl evaluationContext = javaValue.getEvaluationContext();
Project project = evaluationContext.getProject();
evaluationContext.getManagerThread().schedule(new SuspendContextCommandImpl(evaluationContext.getSuspendContext()) {
@Override
public void threadAction(@NotNull SuspendContextImpl suspendContext) {
public void contextAction(@NotNull SuspendContextImpl suspendContext) {
Type type = javaValue.getDescriptor().getType();
final String name = type != null ? type.name() : null;
DebuggerUIUtil.invokeLater(() -> {
@@ -59,6 +59,10 @@
<add-to-group group-id="XDebugger.ValueGroup" anchor="last"/>
<add-to-group group-id="XDebugger.Inspect.Tree.Popup.Bottom.Section.Frontend" anchor="last"/>
</group>
<action id="Debugger.CreateRenderer" class="com.intellij.java.debugger.impl.shared.actions.CreateRendererAction">
<add-to-group group-id="XDebugger.Watches.Inline.Popup" anchor="last"/>
<override-text place="XDebuggerTreePopup"/>
</action>
<action id="Debugger.AutoRenderer" class="com.intellij.java.debugger.impl.shared.actions.AutoRendererAction"/>
<action id="Debugger.MuteRenderers" class="com.intellij.java.debugger.impl.shared.actions.MuteRenderersAction">
<add-to-group group-id="XDebugger.ValueGroup" anchor="after" relative-to-action="Debugger.ViewAsGroup"/>
@@ -0,0 +1,32 @@
// 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.rpc.JavaDebuggerLuxActionsApi
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.xdebugger.impl.frame.XDebugManagerProxy
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil
import kotlinx.coroutines.launch
private class CreateRendererAction : AnAction(), ActionRemoteBehaviorSpecification.FrontendOtherwiseBackend {
override fun update(e: AnActionEvent) {
val values = getSelectedJavaValuesWithDescriptors(e)
e.presentation.setEnabledAndVisible(values.size == 1)
}
override fun actionPerformed(e: AnActionEvent) {
val session = DebuggerUIUtil.getSessionProxy(e) ?: return
val (_, xValue, _) = getSelectedJavaValuesWithDescriptors(e).singleOrNull() ?: return
session.coroutineScope.launch {
XDebugManagerProxy.getInstance().withId(xValue, session) { xValueId ->
JavaDebuggerLuxActionsApi.getInstance().showCreateRendererDialog(xValueId)
}
}
}
override fun getActionUpdateThread(): ActionUpdateThread {
return ActionUpdateThread.BGT
}
}
@@ -98,7 +98,7 @@ private fun getApplicableRenderers(project: Project, values: List<JavaValueDescr
return res ?: emptyList()
}
private fun getSelectedJavaValuesWithDescriptors(event: AnActionEvent): List<Triple<XValueNodeImpl, XValue, JavaValueDescriptor>> {
internal fun getSelectedJavaValuesWithDescriptors(event: AnActionEvent): List<Triple<XValueNodeImpl, XValue, JavaValueDescriptor>> {
val selectedNodes = XDebuggerTree.getSelectedNodes(event.dataContext)
return selectedNodes.map { it to it.valueContainer }
.map { it to it.second.xValueDescriptorAsync?.getNow(null) }
@@ -11,6 +11,7 @@ import fleet.rpc.remoteApiDescriptor
interface JavaDebuggerLuxActionsApi : RemoteApi<Unit> {
suspend fun showInstancesDialog(xValueId: XValueId)
suspend fun showCalculateRetainedSizeDialog(xValueId: XValueId, nodeName: String)
suspend fun showCreateRendererDialog(xValueId: XValueId)
companion object {
@JvmStatic