From e8f0f7c238e0bba830a7e9e2ac99c4ce1e971781 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Tue, 16 Aug 2016 11:48:40 +0300 Subject: [PATCH] made toString - default label renderer for compound renderers --- .../intellij/debugger/engine/JavaValue.java | 16 +++--- .../CompoundRendererConfigurable.java | 5 +- .../settings/NodeRendererSettings.java | 4 -- .../ui/tree/render/ClassObjectRenderer.java | 2 +- .../ui/tree/render/ColorObjectRenderer.java | 4 +- .../ui/tree/render/CompoundTypeRenderer.java | 49 +++++++++++++++++-- .../ui/tree/render/FileObjectRenderer.java | 2 +- .../tree/render/GraphicsObjectRenderer.java | 4 +- .../ui/tree/render/IconObjectRenderer.java | 4 +- .../ui/tree/render/ImageObjectRenderer.java | 4 +- .../StackTraceElementObjectRenderer.java | 4 +- .../ui/tree/render/ToStringBasedRenderer.java | 29 ++--------- 12 files changed, 71 insertions(+), 56 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java index 2935c5077802..dd9ef47020ab 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java @@ -31,6 +31,7 @@ import com.intellij.debugger.ui.impl.DebuggerTreeRenderer; import com.intellij.debugger.ui.impl.watch.*; import com.intellij.debugger.ui.tree.*; import com.intellij.debugger.ui.tree.render.*; +import com.intellij.debugger.ui.tree.render.Renderer; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -294,17 +295,20 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV } } - String value = myValue; if (myValueDescriptor.isString()) { renderer.renderStringValue(myValue, "\"", XValueNode.MAX_VALUE_LENGTH); return; } - else if (myValueDescriptor.getLastRenderer() instanceof ToStringRenderer || - myValueDescriptor.getLastRenderer() instanceof ToStringBasedRenderer) { - value = StringUtil.wrapWithDoubleQuote(truncateToMaxLength(myValue)); + + String value = truncateToMaxLength(myValue); + Renderer lastRenderer = myValueDescriptor.getLastRenderer(); + if (lastRenderer instanceof CompoundTypeRenderer) { + lastRenderer = ((CompoundTypeRenderer)lastRenderer).getLabelRenderer(); } - else if (myValueDescriptor.getLastRenderer() instanceof CompoundTypeRenderer) { - value = truncateToMaxLength(myValue); + if (lastRenderer instanceof ToStringRenderer) { + if (!StringUtil.isEmpty(value)) { + value = StringUtil.wrapWithDoubleQuote(value); + } } renderer.renderValue(value); } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java index 253f62e75797..55dc8ffb948c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java @@ -357,11 +357,10 @@ class CompoundRendererConfigurable extends JPanel { final ValueLabelRenderer labelRenderer = myRenderer.getLabelRenderer(); final ChildrenRenderer childrenRenderer = myRenderer.getChildrenRenderer(); - final NodeRendererSettings rendererSettings = NodeRendererSettings.getInstance(); myShowTypeCheckBox.setSelected(myRenderer.isShowType()); - if (rendererSettings.isBase(labelRenderer)) { + if (myRenderer.isBaseRenderer(labelRenderer)) { myLabelEditor.setExpression(TextWithImportsImpl.toXExpression(emptyExpressionFragment)); myRbDefaultLabel.setSelected(true); } @@ -373,7 +372,7 @@ class CompoundRendererConfigurable extends JPanel { getTableModel().clear(); myAppendDefaultChildren.setSelected(false); - if (rendererSettings.isBase(childrenRenderer)) { + if (myRenderer.isBaseRenderer(childrenRenderer)) { myRbDefaultChildrenRenderer.setSelected(true); myChildrenEditor.setExpression(TextWithImportsImpl.toXExpression(emptyExpressionFragment)); myChildrenExpandedEditor.setExpression(TextWithImportsImpl.toXExpression(emptyExpressionFragment)); 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 5ffeed52cee4..3f10c7a6a5b8 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/NodeRendererSettings.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/NodeRendererSettings.java @@ -263,10 +263,6 @@ public class NodeRendererSettings implements PersistentStateComponent { return allRenderers; } - public boolean isBase(final Renderer renderer) { - return renderer == myPrimitiveRenderer || renderer == myArrayRenderer || renderer == myClassRenderer; - } - public Renderer readRenderer(Element root) throws InvalidDataException { if (root == null) { return null; diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassObjectRenderer.java index 030a0a18c88d..a0887d184ea0 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassObjectRenderer.java @@ -38,7 +38,7 @@ import java.util.Collections; /** * @author egor */ -class ClassObjectRenderer extends ToStringBasedRenderer implements FullValueEvaluatorProvider { +class ClassObjectRenderer extends CompoundReferenceRenderer implements FullValueEvaluatorProvider { private static final Logger LOG = Logger.getInstance(ClassObjectRenderer.class); public ClassObjectRenderer(final NodeRendererSettings rendererSettings) { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ColorObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ColorObjectRenderer.java index 31bf6f0981d7..69e4a4191560 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ColorObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ColorObjectRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ import java.awt.*; /** * Created by Egor on 04.10.2014. */ -class ColorObjectRenderer extends ToStringBasedRenderer { +class ColorObjectRenderer extends CompoundReferenceRenderer { public ColorObjectRenderer(final NodeRendererSettings rendererSettings) { super(rendererSettings, "Color", null, null); setClassName("java.awt.Color"); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CompoundTypeRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CompoundTypeRenderer.java index 4707d20e5f10..9b18b5bf043c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CompoundTypeRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CompoundTypeRenderer.java @@ -18,14 +18,20 @@ package com.intellij.debugger.ui.tree.render; import com.intellij.debugger.DebuggerContext; import com.intellij.debugger.engine.DebugProcess; import com.intellij.debugger.engine.DebuggerUtils; +import com.intellij.debugger.engine.evaluation.EvaluateException; +import com.intellij.debugger.engine.evaluation.EvaluationContext; import com.intellij.debugger.settings.NodeRendererSettings; import com.intellij.debugger.ui.tree.DebuggerTreeNode; +import com.intellij.debugger.ui.tree.ValueDescriptor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.impl.PsiJavaParserFacadeImpl; +import com.intellij.psi.CommonClassNames; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementFactory; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.TypeConversionUtil; +import com.sun.jdi.ReferenceType; import com.sun.jdi.Type; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -33,6 +39,7 @@ import org.jetbrains.annotations.NotNull; public class CompoundTypeRenderer extends CompoundNodeRenderer { public static final @NonNls String UNIQUE_ID = "CompoundTypeRenderer"; protected static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer"); + private static final AutoToStringRenderer AUTO_TO_STRING_RENDERER = new AutoToStringRenderer(); public CompoundTypeRenderer(NodeRendererSettings rendererSettings, String name, @@ -46,7 +53,7 @@ public class CompoundTypeRenderer extends CompoundNodeRenderer { public void setLabelRenderer(ValueLabelRenderer labelRenderer) { final ValueLabelRenderer prevRenderer = getLabelRenderer(); - super.setLabelRenderer(myRendererSettings.isBase(labelRenderer) ? null : labelRenderer); + super.setLabelRenderer(isBaseRenderer(labelRenderer) ? null : labelRenderer); final ValueLabelRenderer currentRenderer = getLabelRenderer(); if (prevRenderer != currentRenderer) { if (currentRenderer instanceof TypeRenderer) { @@ -57,7 +64,7 @@ public class CompoundTypeRenderer extends CompoundNodeRenderer { public void setChildrenRenderer(ChildrenRenderer childrenRenderer) { final ChildrenRenderer prevRenderer = getChildrenRenderer(); - super.setChildrenRenderer(myRendererSettings.isBase(childrenRenderer) ? null : childrenRenderer); + super.setChildrenRenderer(isBaseRenderer(childrenRenderer) ? null : childrenRenderer); final ChildrenRenderer currentRenderer = getChildrenRenderer(); if (prevRenderer != currentRenderer) { if (currentRenderer instanceof TypeRenderer) { @@ -76,7 +83,7 @@ public class CompoundTypeRenderer extends CompoundNodeRenderer { if (TypeConversionUtil.isPrimitive(name)) { return myRendererSettings.getPrimitiveRenderer(); } - return name.endsWith("]") ? myRendererSettings.getArrayRenderer() : myRendererSettings.getClassRenderer(); + return name.endsWith("]") ? myRendererSettings.getArrayRenderer() : AUTO_TO_STRING_RENDERER; } public ValueLabelRenderer getLabelRenderer() { @@ -142,4 +149,36 @@ public class CompoundTypeRenderer extends CompoundNodeRenderer { PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); return elementFactory.createExpressionFromText(text, getContext(project, context)); } + + public boolean isBaseRenderer(Renderer renderer) { + return renderer == AUTO_TO_STRING_RENDERER || + renderer == myRendererSettings.getClassRenderer() || + renderer == myRendererSettings.getPrimitiveRenderer() || + renderer == myRendererSettings.getArrayRenderer(); + } + + private static class AutoToStringRenderer extends ToStringRenderer { + @Override + public String getUniqueId() { + return "AutoToString"; + } + + @Override + public boolean isApplicable(Type type) { + return type instanceof ReferenceType; + } + + @Override + public String calcLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener listener) + throws EvaluateException { + NodeRendererSettings nodeRendererSettings = NodeRendererSettings.getInstance(); + ToStringRenderer toStringRenderer = nodeRendererSettings.getToStringRenderer(); + if (toStringRenderer.isEnabled() && toStringRenderer.isApplicable(descriptor.getType())) { + return toStringRenderer.calcLabel(descriptor, evaluationContext, listener); + } + else { + return nodeRendererSettings.getClassRenderer().calcLabel(descriptor, evaluationContext, listener); + } + } + } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/FileObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/FileObjectRenderer.java index c4e842ce945f..ec13546e55ab 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/FileObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/FileObjectRenderer.java @@ -21,7 +21,7 @@ import com.intellij.openapi.util.registry.Registry; /** * @author egor */ -public class FileObjectRenderer extends ToStringBasedRenderer { +public class FileObjectRenderer extends CompoundReferenceRenderer { public FileObjectRenderer(final NodeRendererSettings rendererSettings) { super(rendererSettings, "File", null, NodeRendererSettings.createExpressionChildrenRenderer("listFiles()", null)); setClassName("java.io.File"); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/GraphicsObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/GraphicsObjectRenderer.java index b3b257a5824f..aaab65cc0756 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/GraphicsObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/GraphicsObjectRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ import javax.swing.*; /** * @author egor */ -public class GraphicsObjectRenderer extends ToStringBasedRenderer implements FullValueEvaluatorProvider { +public class GraphicsObjectRenderer extends CompoundReferenceRenderer implements FullValueEvaluatorProvider { public GraphicsObjectRenderer(final NodeRendererSettings rendererSettings) { super(rendererSettings, "Graphics", null, null); setClassName("sun.java2d.SunGraphics2D"); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/IconObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/IconObjectRenderer.java index f74cf56286a9..0e1862e9890e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/IconObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/IconObjectRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,7 @@ import javax.swing.*; /** * Created by Egor on 04.10.2014. */ -class IconObjectRenderer extends ToStringBasedRenderer implements FullValueEvaluatorProvider { +class IconObjectRenderer extends CompoundReferenceRenderer implements FullValueEvaluatorProvider { public IconObjectRenderer(final NodeRendererSettings rendererSettings) { super(rendererSettings, "Icon", null, null); setClassName("javax.swing.Icon"); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ImageObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ImageObjectRenderer.java index 701f7ef7945e..89465f9463a9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ImageObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ImageObjectRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ import java.util.List; /** * Created by Egor on 04.10.2014. */ -class ImageObjectRenderer extends ToStringBasedRenderer implements FullValueEvaluatorProvider { +class ImageObjectRenderer extends CompoundReferenceRenderer implements FullValueEvaluatorProvider { private static final Logger LOG = Logger.getInstance(ImageObjectRenderer.class); public ImageObjectRenderer(final NodeRendererSettings rendererSettings) { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/StackTraceElementObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/StackTraceElementObjectRenderer.java index ce6e1a024f9d..f0985946a05e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/StackTraceElementObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/StackTraceElementObjectRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ import java.util.Collections; /** * @author egor */ -class StackTraceElementObjectRenderer extends ToStringBasedRenderer implements FullValueEvaluatorProvider { +class StackTraceElementObjectRenderer extends CompoundReferenceRenderer implements FullValueEvaluatorProvider { private static final Logger LOG = Logger.getInstance(StackTraceElementObjectRenderer.class); public StackTraceElementObjectRenderer(final NodeRendererSettings rendererSettings) { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringBasedRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringBasedRenderer.java index 3fc5070ec15b..726fc9161a67 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringBasedRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ToStringBasedRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,16 +15,13 @@ */ package com.intellij.debugger.ui.tree.render; -import com.intellij.debugger.DebuggerManagerEx; -import com.intellij.debugger.engine.evaluation.EvaluateException; -import com.intellij.debugger.engine.evaluation.EvaluationContext; import com.intellij.debugger.settings.NodeRendererSettings; -import com.intellij.debugger.ui.tree.ValueDescriptor; -import com.intellij.debugger.ui.tree.render.*; /** * @author egor + * @deprecated all CompoundTypeRenderers now have default toString renderer */ +@Deprecated public abstract class ToStringBasedRenderer extends CompoundReferenceRenderer { public ToStringBasedRenderer(NodeRendererSettings rendererSettings, String name, @@ -32,24 +29,4 @@ public abstract class ToStringBasedRenderer extends CompoundReferenceRenderer { ChildrenRenderer childrenRenderer) { super(rendererSettings, name, labelRenderer, childrenRenderer); } - - public String calcLabel(ValueDescriptor descriptor, - EvaluationContext evaluationContext, - DescriptorLabelListener listener) throws EvaluateException { - String res = calcToStringLabel(descriptor, evaluationContext, listener); - if (res != null) { - return res; - } - return super.calcLabel(descriptor, evaluationContext, listener); - } - - protected String calcToStringLabel(ValueDescriptor descriptor, EvaluationContext evaluationContext, DescriptorLabelListener listener) - throws EvaluateException { - final ToStringRenderer toStringRenderer = myRendererSettings.getToStringRenderer(); - if (toStringRenderer.isEnabled() && DebuggerManagerEx.getInstanceEx(evaluationContext.getProject()).getContext().isEvaluationPossible()) { - return toStringRenderer.calcLabel(descriptor, evaluationContext, listener); - } - return null; - } - }