diff --git a/java/debugger/impl/src/com/intellij/debugger/collections/visualizer/CollectionVisualizer.kt b/java/debugger/impl/src/com/intellij/debugger/collections/visualizer/CollectionVisualizer.kt index 5cabe5f85469..173ff77cce84 100644 --- a/java/debugger/impl/src/com/intellij/debugger/collections/visualizer/CollectionVisualizer.kt +++ b/java/debugger/impl/src/com/intellij/debugger/collections/visualizer/CollectionVisualizer.kt @@ -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("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) } } } } diff --git a/java/debugger/impl/src/com/intellij/debugger/collections/visualizer/CollectionVisualizerEvaluator.kt b/java/debugger/impl/src/com/intellij/debugger/collections/visualizer/CollectionVisualizerEvaluator.kt index 77c988a2157c..e49e80cde724 100644 --- a/java/debugger/impl/src/com/intellij/debugger/collections/visualizer/CollectionVisualizerEvaluator.kt +++ b/java/debugger/impl/src/com/intellij/debugger/collections/visualizer/CollectionVisualizerEvaluator.kt @@ -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() ?: "" 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) + } } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/NodeRendererSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/NodeRendererSettings.java index a7b7ee0c7ac2..0983465734b7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/NodeRendererSettings.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/NodeRendererSettings.java @@ -575,7 +575,7 @@ public class NodeRendererSettings implements PersistentStateComponent { createExpressionArrayChildrenRenderer("toArray()", "!isEmpty()", arrayRenderer)); setClassName(CommonClassNames.JAVA_UTIL_LIST); setIsApplicableChecker(type -> DebuggerUtilsAsync.instanceOf(type, getClassName())); - setFullValueEvaluator(new CollectionVisualizerEvaluator(getClassName())); + setFullValueEvaluator(CollectionVisualizerEvaluator.createFor(getClassName())); } @Override diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ArrayRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ArrayRenderer.java index f0f8e823cb4d..0e1ed6ce96ab 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ArrayRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ArrayRenderer.java @@ -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 {