[debugger] IDEA-349254 Support arrays

GitOrigin-RevId: 7ee3644cee7d3cbfce768052ad1bc4316d4f10a0
This commit is contained in:
Alexander Kuznetsov
2024-10-14 17:27:11 +00:00
committed by intellij-monorepo-bot
parent 7d22b2f36b
commit 1051ef13e9
4 changed files with 30 additions and 22 deletions
@@ -9,29 +9,20 @@ import kotlinx.coroutines.CoroutineScope
import javax.swing.JComponent
interface CollectionVisualizer {
fun applicableFor(collectionClass: String): Boolean
fun createComponent(
project: Project,
baseCollectionClass: String,
descriptor: ValueDescriptor,
evaluationContext: EvaluationContextImpl,
scope: CoroutineScope,
): JComponent?
): JComponent
companion object {
private val EP_NAME = ExtensionPointName.create<CollectionVisualizer>("com.intellij.debugger.collectionVisualizer")
fun createComponent(
project: Project,
baseCollectionClass: String,
valueDescriptor: ValueDescriptor,
evaluationContext: EvaluationContextImpl,
scope: CoroutineScope
): JComponent? {
for (visualizer in EP_NAME.extensionList) {
val component = visualizer.createComponent(project, baseCollectionClass, valueDescriptor, evaluationContext, scope) ?: continue
return component
}
return null
fun findApplicable(collectionClass: String): CollectionVisualizer? {
return EP_NAME.findFirstSafe { it.applicableFor(collectionClass) }
}
}
}
@@ -18,7 +18,7 @@ import kotlinx.coroutines.cancel
import java.awt.event.MouseEvent
import javax.swing.JComponent
class CollectionVisualizerEvaluator(private val baseCollectionClass: String) : FullValueEvaluatorProvider {
class CollectionVisualizerEvaluator(private val visualizer: CollectionVisualizer) : FullValueEvaluatorProvider {
override fun getFullValueEvaluator(evaluationContext: EvaluationContextImpl, valueDescriptor: ValueDescriptorImpl): XFullValueEvaluator? {
val presenterName = valueDescriptor.type?.name() ?: "<unknown name>"
val scope = evaluationContext.managerThread.coroutineScope.childScope("Collection presentation for $presenterName")
@@ -29,7 +29,7 @@ class CollectionVisualizerEvaluator(private val baseCollectionClass: String) : F
}
override fun createComponent(fullValue: String?): JComponent? {
return CollectionVisualizer.createComponent(evaluationContext.project, baseCollectionClass, valueDescriptor, evaluationContext, scope)
return visualizer.createComponent(evaluationContext.project, valueDescriptor, evaluationContext, scope)
}
override fun showValuePopup(event: MouseEvent, project: Project, editor: Editor?, component: JComponent, cancelCallback: Runnable?) {
@@ -62,4 +62,9 @@ class CollectionVisualizerEvaluator(private val baseCollectionClass: String) : F
}
})
}
companion object {
@JvmStatic
fun createFor(collectionClass: String) = CollectionVisualizer.findApplicable(collectionClass)?.let(::CollectionVisualizerEvaluator)
}
}
@@ -575,7 +575,7 @@ public class NodeRendererSettings implements PersistentStateComponent<Element> {
createExpressionArrayChildrenRenderer("toArray()", "!isEmpty()", arrayRenderer));
setClassName(CommonClassNames.JAVA_UTIL_LIST);
setIsApplicableChecker(type -> DebuggerUtilsAsync.instanceOf(type, getClassName()));
setFullValueEvaluator(new CollectionVisualizerEvaluator(getClassName()));
setFullValueEvaluator(CollectionVisualizerEvaluator.createFor(getClassName()));
}
@Override
@@ -5,10 +5,8 @@ import com.intellij.debugger.DebuggerContext;
import com.intellij.debugger.DebuggerManagerEx;
import com.intellij.debugger.JavaDebuggerBundle;
import com.intellij.debugger.actions.ArrayAction;
import com.intellij.debugger.engine.ContextUtil;
import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.DebuggerManagerThreadImpl;
import com.intellij.debugger.engine.JavaValue;
import com.intellij.debugger.collections.visualizer.CollectionVisualizerEvaluator;
import com.intellij.debugger.engine.*;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.evaluation.EvaluationContext;
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
@@ -43,6 +41,7 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.xdebugger.XExpression;
import com.intellij.xdebugger.frame.XCompositeNode;
import com.intellij.xdebugger.frame.XDebuggerTreeNodeHyperlink;
import com.intellij.xdebugger.frame.XFullValueEvaluator;
import com.intellij.xdebugger.frame.XValueChildrenList;
import com.intellij.xdebugger.impl.ui.tree.XDebuggerTree;
import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
@@ -50,6 +49,8 @@ import com.sun.jdi.*;
import one.util.streamex.StreamEx;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
@@ -60,10 +61,11 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class ArrayRenderer extends NodeRendererImpl {
public class ArrayRenderer extends NodeRendererImpl implements FullValueEvaluatorProvider {
private static final Logger LOG = Logger.getInstance(ArrayRenderer.class);
public static final @NonNls String UNIQUE_ID = "ArrayRenderer";
public static final @NonNls String VISUALIZER_ID = "%Array%";
public int START_INDEX = 0;
public int END_INDEX = Integer.MAX_VALUE;
@@ -95,6 +97,16 @@ public class ArrayRenderer extends NodeRendererImpl {
return (ArrayRenderer)super.clone();
}
@Override
public @Nullable XFullValueEvaluator getFullValueEvaluator(@NotNull EvaluationContextImpl evaluationContext,
@NotNull ValueDescriptorImpl valueDescriptor) {
CollectionVisualizerEvaluator evaluator = CollectionVisualizerEvaluator.createFor(VISUALIZER_ID);
if (evaluator == null) {
return null;
}
return evaluator.getFullValueEvaluator(evaluationContext, valueDescriptor);
}
@Override
public String calcLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener listener)
throws EvaluateException {