allow user renderers for primitive types

This commit is contained in:
Egor.Ushakov
2016-08-03 14:47:08 +03:00
parent f73dbb431b
commit 3c8f350a73
15 changed files with 306 additions and 223 deletions
@@ -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.
@@ -22,7 +22,7 @@ import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.settings.NodeRendererSettings;
import com.intellij.debugger.settings.UserRenderersConfigurable;
import com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer;
import com.intellij.debugger.ui.tree.render.NodeRenderer;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.options.ConfigurableBase;
@@ -83,8 +83,7 @@ public class CreateRendererAction extends AnAction {
};
SingleConfigurableEditor editor = new SingleConfigurableEditor(project, configurable);
if (name != null) {
CompoundReferenceRenderer renderer =
NodeRendererSettings.getInstance().createCompoundReferenceRenderer(name, name, null, null);
NodeRenderer renderer = NodeRendererSettings.getInstance().createCompoundTypeRenderer(name, name, null, null);
renderer.setEnabled(true);
ui.addRenderer(renderer);
}
@@ -303,7 +303,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV
myValueDescriptor.getLastRenderer() instanceof ToStringBasedRenderer) {
value = StringUtil.wrapWithDoubleQuote(truncateToMaxLength(myValue));
}
else if (myValueDescriptor.getLastRenderer() instanceof CompoundReferenceRenderer) {
else if (myValueDescriptor.getLastRenderer() instanceof CompoundTypeRenderer) {
value = truncateToMaxLength(myValue);
}
renderer.renderValue(value);
@@ -36,9 +36,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.JDOMExternalizerUtil;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiExpression;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiJavaParserFacadeImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.net.NetUtils;
import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters;
import com.intellij.util.xmlb.XmlSerializer;
@@ -138,6 +139,27 @@ public class DebuggerUtilsImpl extends DebuggerUtilsEx{
return PositionUtil.getContextElement(context);
}
public static Pair<PsiClass, PsiType> getPsiClassAndType(String className, Project project) {
PsiClass contextClass;
PsiType contextType;
PsiPrimitiveType primitiveType = PsiJavaParserFacadeImpl.getPrimitiveType(className);
if (primitiveType != null) {
contextClass = JavaPsiFacade.getInstance(project).findClass(primitiveType.getBoxedTypeName(), GlobalSearchScope.allScope(project));
contextType = primitiveType;
}
else {
contextClass = findClass(className, project, GlobalSearchScope.allScope(project));
if (contextClass != null) {
contextClass = (PsiClass)contextClass.getNavigationElement();
}
if (contextClass instanceof PsiCompiledElement) {
contextClass = (PsiClass)((PsiCompiledElement)contextClass).getMirror();
}
contextType = getType(className, project);
}
return Pair.create(contextClass, contextType);
}
@Override
public PsiClass chooseClassDialog(String title, Project project) {
TreeClassChooser dialog = TreeClassChooserFactory.getInstance(project).createAllProjectScopeChooser(title);
@@ -52,8 +52,8 @@ import java.util.ArrayList;
import java.util.List;
class CompoundRendererConfigurable extends JPanel {
private CompoundReferenceRenderer myRenderer;
private CompoundReferenceRenderer myOriginalRenderer;
private CompoundTypeRenderer myRenderer;
private CompoundTypeRenderer myOriginalRenderer;
private Project myProject;
private final ClassNameEditorWithBrowseButton myClassNameField;
private final JRadioButton myRbDefaultLabel;
@@ -187,9 +187,9 @@ class CompoundRendererConfigurable extends JPanel {
}
public void setRenderer(NodeRenderer renderer) {
if (renderer instanceof CompoundReferenceRenderer) {
myRenderer = (CompoundReferenceRenderer)renderer;
myOriginalRenderer = (CompoundReferenceRenderer)renderer.clone();
if (renderer instanceof CompoundTypeRenderer) {
myRenderer = (CompoundTypeRenderer)renderer;
myOriginalRenderer = (CompoundTypeRenderer)renderer.clone();
}
else {
myRenderer = myOriginalRenderer = null;
@@ -197,7 +197,7 @@ class CompoundRendererConfigurable extends JPanel {
reset();
}
public CompoundReferenceRenderer getRenderer() {
public CompoundTypeRenderer getRenderer() {
return myRenderer;
}
@@ -300,7 +300,7 @@ class CompoundRendererConfigurable extends JPanel {
if (myRenderer == null) {
return false;
}
final CompoundReferenceRenderer cloned = (CompoundReferenceRenderer)myRenderer.clone();
final CompoundTypeRenderer cloned = (CompoundTypeRenderer)myRenderer.clone();
flushDataTo(cloned);
return !DebuggerUtilsEx.externalizableEqual(cloned, myOriginalRenderer);
}
@@ -311,10 +311,10 @@ class CompoundRendererConfigurable extends JPanel {
}
flushDataTo(myRenderer);
// update the renderer to compare with in order to find out whether we've been modified since last apply
myOriginalRenderer = (CompoundReferenceRenderer)myRenderer.clone();
myOriginalRenderer = (CompoundTypeRenderer)myRenderer.clone();
}
private void flushDataTo(final CompoundReferenceRenderer renderer) { // label
private void flushDataTo(final CompoundTypeRenderer renderer) { // label
LabelRenderer labelRenderer = null;
renderer.setShowType(myShowTypeCheckBox.isSelected());
if (myRbExpressionLabel.isSelected()) {
@@ -328,9 +328,20 @@ public class NodeRendererSettings implements PersistentStateComponent<Element> {
else if(rendererId.equals(CompoundNodeRenderer.UNIQUE_ID) || rendererId.equals(REFERENCE_RENDERER)) {
return createCompoundReferenceRenderer("unnamed", CommonClassNames.JAVA_LANG_OBJECT, null, null);
}
else if (rendererId.equals(CompoundTypeRenderer.UNIQUE_ID)) {
return createCompoundTypeRenderer("unnamed", CommonClassNames.JAVA_LANG_OBJECT, null, null);
}
return null;
}
public CompoundTypeRenderer createCompoundTypeRenderer(
@NonNls final String rendererName, @NonNls final String className, final ValueLabelRenderer labelRenderer, final ChildrenRenderer childrenRenderer
) {
CompoundTypeRenderer renderer = new CompoundTypeRenderer(this, rendererName, labelRenderer, childrenRenderer);
renderer.setClassName(className);
return renderer;
}
public CompoundReferenceRenderer createCompoundReferenceRenderer(
@NonNls final String rendererName, @NonNls final String className, final ValueLabelRenderer labelRenderer, final ChildrenRenderer childrenRenderer
) {
@@ -16,7 +16,7 @@
package com.intellij.debugger.settings;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.ui.tree.render.CompoundNodeRenderer;
import com.intellij.debugger.ui.tree.render.CompoundTypeRenderer;
import com.intellij.debugger.ui.tree.render.NodeRenderer;
import com.intellij.ide.util.ElementsChooser;
import com.intellij.openapi.Disposable;
@@ -209,7 +209,7 @@ public final class UserRenderersConfigurable extends JPanel implements Configura
@Override
public void run(AnActionButton button) {
final NodeRenderer renderer = (NodeRenderer)NodeRendererSettings.getInstance().createRenderer(CompoundNodeRenderer.UNIQUE_ID);
NodeRenderer renderer = (NodeRenderer)NodeRendererSettings.getInstance().createRenderer(CompoundTypeRenderer.UNIQUE_ID);
renderer.setEnabled(true);
addRenderer(renderer);
SwingUtilities.invokeLater(myNameField::requestFocus);
@@ -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.
@@ -21,19 +21,19 @@
package com.intellij.debugger.ui.impl.watch;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.engine.StackFrameContext;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
import com.intellij.debugger.engine.evaluation.TextWithImports;
import com.intellij.debugger.impl.DebuggerUtilsImpl;
import com.intellij.debugger.ui.tree.UserExpressionDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiCodeFragment;
import com.sun.jdi.ObjectReference;
import com.intellij.psi.PsiType;
import com.sun.jdi.Type;
import com.sun.jdi.Value;
import org.jetbrains.annotations.Nullable;
public class UserExpressionDescriptorImpl extends EvaluationDescriptor implements UserExpressionDescriptor{
@@ -60,24 +60,11 @@ public class UserExpressionDescriptorImpl extends EvaluationDescriptor implement
}
protected PsiCodeFragment getEvaluationCode(final StackFrameContext context) throws EvaluateException {
Value value = myParentDescriptor.getValue();
if(value instanceof ObjectReference) {
final String typeName = value.type().name();
final PsiClass psiClass = DebuggerUtils.findClass(myTypeName, myProject, context.getDebugProcess().getSearchScope());
if (psiClass == null) {
throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.invalid.type.name", typeName));
}
return createCodeFragment(psiClass);
}
else {
throw EvaluateExceptionUtil.createEvaluateException(
DebuggerBundle.message("evaluation.error.objref.expected", myParentDescriptor.getName())
);
Pair<PsiClass, PsiType> psiClassAndType = DebuggerUtilsImpl.getPsiClassAndType(myTypeName, myProject);
if (psiClassAndType.first == null) {
throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.invalid.type.name", myTypeName));
}
return createCodeFragment(psiClassAndType.first);
}
public ValueDescriptorImpl getParentDescriptor() {
@@ -18,9 +18,10 @@ package com.intellij.debugger.ui.tree.render;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.engine.evaluation.*;
import com.intellij.debugger.engine.evaluation.expression.ExpressionEvaluator;
import com.intellij.debugger.impl.DebuggerUtilsImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiJavaParserFacadeImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.reference.SoftReference;
import org.jetbrains.annotations.Nullable;
@@ -66,31 +67,14 @@ public abstract class CachedEvaluator {
protected Cache initEvaluatorAndChildrenExpression(final Project project) {
final Cache cache = new Cache();
try {
String className = getClassName();
PsiClass contextClass;
PsiType contextType;
PsiPrimitiveType primitiveType = PsiJavaParserFacadeImpl.getPrimitiveType(className);
if (primitiveType != null) {
contextClass = JavaPsiFacade.getInstance(project).findClass(primitiveType.getBoxedTypeName(), GlobalSearchScope.allScope(project));
contextType = primitiveType;
}
else {
contextClass = DebuggerUtils.findClass(className, project, GlobalSearchScope.allScope(project));
if (contextClass != null) {
contextClass = (PsiClass)contextClass.getNavigationElement();
}
if (contextClass instanceof PsiCompiledElement) {
contextClass = (PsiClass)((PsiCompiledElement)contextClass).getMirror();
}
if (contextClass == null) {
throw EvaluateExceptionUtil.CANNOT_FIND_SOURCE_CLASS;
}
contextType = DebuggerUtils.getType(className, project);
Pair<PsiClass, PsiType> psiClassAndType = DebuggerUtilsImpl.getPsiClassAndType(getClassName(), project);
if (psiClassAndType.first == null) {
throw EvaluateExceptionUtil.CANNOT_FIND_SOURCE_CLASS;
}
cache.myPsiChildrenExpression = null;
JavaCodeFragment codeFragment = myDefaultFragmentFactory.createCodeFragment(myReferenceExpression, contextClass, project);
JavaCodeFragment codeFragment = myDefaultFragmentFactory.createCodeFragment(myReferenceExpression, psiClassAndType.first, project);
codeFragment.forceResolveScope(GlobalSearchScope.allScope(project));
codeFragment.setThisType(contextType);
codeFragment.setThisType(psiClassAndType.second);
DebuggerUtils.checkSyntax(codeFragment);
cache.myPsiChildrenExpression = codeFragment instanceof PsiExpressionCodeFragment ? ((PsiExpressionCodeFragment)codeFragment).getExpression() : null;
cache.myEvaluator = myDefaultFragmentFactory.getEvaluatorBuilder().build(codeFragment, null);
@@ -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,118 +15,22 @@
*/
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.settings.NodeRendererSettings;
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
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.sun.jdi.ReferenceType;
import com.sun.jdi.Type;
import org.jetbrains.annotations.NotNull;
public class CompoundReferenceRenderer extends CompoundNodeRenderer{
protected static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer");
public CompoundReferenceRenderer(final NodeRendererSettings rendererSettings, String name, ValueLabelRenderer labelRenderer, ChildrenRenderer childrenRenderer) {
public class CompoundReferenceRenderer extends CompoundTypeRenderer {
public CompoundReferenceRenderer(NodeRendererSettings rendererSettings,
String name,
ValueLabelRenderer labelRenderer,
ChildrenRenderer childrenRenderer) {
super(rendererSettings, name, labelRenderer, childrenRenderer);
myProperties.setClassName(CommonClassNames.JAVA_LANG_OBJECT);
LOG.assertTrue(labelRenderer == null || labelRenderer instanceof ReferenceRenderer);
LOG.assertTrue(childrenRenderer == null || childrenRenderer instanceof ReferenceRenderer);
}
public void setLabelRenderer(ValueLabelRenderer labelRenderer) {
final ValueLabelRenderer prevRenderer = getLabelRenderer();
super.setLabelRenderer(myRendererSettings.isBase(labelRenderer) ? null : labelRenderer);
final ValueLabelRenderer currentRenderer = getLabelRenderer();
if (prevRenderer != currentRenderer) {
if (currentRenderer instanceof ReferenceRenderer) {
((ReferenceRenderer)currentRenderer).setClassName(getClassName());
}
}
}
public void setChildrenRenderer(ChildrenRenderer childrenRenderer) {
final ChildrenRenderer prevRenderer = getChildrenRenderer();
super.setChildrenRenderer(myRendererSettings.isBase(childrenRenderer) ? null : childrenRenderer);
final ChildrenRenderer currentRenderer = getChildrenRenderer();
if (prevRenderer != currentRenderer) {
if (currentRenderer instanceof ReferenceRenderer) {
((ReferenceRenderer)currentRenderer).setClassName(getClassName());
}
}
}
public ChildrenRenderer getChildrenRenderer() {
final ChildrenRenderer childrenRenderer = super.getChildrenRenderer();
return childrenRenderer != null ? childrenRenderer : getDefaultRenderer();
}
private NodeRenderer getDefaultRenderer() {
return getClassName().endsWith("]") ? myRendererSettings.getArrayRenderer() : myRendererSettings.getClassRenderer();
}
public ValueLabelRenderer getLabelRenderer() {
final ValueLabelRenderer labelRenderer = super.getLabelRenderer();
return labelRenderer != null ? labelRenderer : getDefaultRenderer();
}
private ChildrenRenderer getRawChildrenRenderer() {
NodeRenderer classRenderer = getDefaultRenderer();
final ChildrenRenderer originalRenderer = super.getChildrenRenderer();
return originalRenderer == classRenderer ? null : originalRenderer;
}
private ValueLabelRenderer getRawLabelRenderer() {
NodeRenderer classRenderer = getDefaultRenderer();
final ValueLabelRenderer originalRenderer = super.getLabelRenderer();
return originalRenderer == classRenderer ? null : originalRenderer;
}
public boolean isApplicable(Type type) {
if(type == null || !(type instanceof ReferenceType) || !DebuggerUtils.instanceOf(type, getClassName())) {
return false;
if (type instanceof ReferenceType) {
return super.isApplicable(type);
}
return super.isApplicable(type);
}
public void setClassName(@NotNull String name) {
myProperties.setClassName(name);
if(getRawLabelRenderer() != null) {
final ValueLabelRenderer originalLabelRenderer = super.getLabelRenderer();
if (originalLabelRenderer instanceof ReferenceRenderer) {
((ReferenceRenderer)originalLabelRenderer).setClassName(name);
}
}
if(getRawChildrenRenderer() != null) {
final ChildrenRenderer originalChildrenRenderer = super.getChildrenRenderer();
if (originalChildrenRenderer instanceof ReferenceRenderer) {
((ReferenceRenderer)originalChildrenRenderer).setClassName(name);
}
}
}
public @NotNull String getClassName() {
return myProperties.getClassName();
}
protected final PsiElement getContext(Project project, DebuggerContext context) {
DebugProcess process = context.getDebugProcess();
GlobalSearchScope scope = process != null ? process.getSearchScope() : GlobalSearchScope.allScope(project);
return DebuggerUtils.findClass(getClassName(), project, scope);
}
protected final PsiElement getChildValueExpression(String text, DebuggerTreeNode node, DebuggerContext context) {
Project project = node.getProject();
PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
return elementFactory.createExpressionFromText(text, getContext(project, context));
return false;
}
}
@@ -0,0 +1,145 @@
/*
* 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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.settings.NodeRendererSettings;
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
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.search.GlobalSearchScope;
import com.intellij.psi.util.TypeConversionUtil;
import com.sun.jdi.Type;
import org.jetbrains.annotations.NonNls;
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");
public CompoundTypeRenderer(NodeRendererSettings rendererSettings,
String name,
ValueLabelRenderer labelRenderer,
ChildrenRenderer childrenRenderer) {
super(rendererSettings, name, labelRenderer, childrenRenderer);
myProperties.setClassName(CommonClassNames.JAVA_LANG_OBJECT);
LOG.assertTrue(labelRenderer == null || labelRenderer instanceof TypeRenderer);
LOG.assertTrue(childrenRenderer == null || childrenRenderer instanceof TypeRenderer);
}
public void setLabelRenderer(ValueLabelRenderer labelRenderer) {
final ValueLabelRenderer prevRenderer = getLabelRenderer();
super.setLabelRenderer(myRendererSettings.isBase(labelRenderer) ? null : labelRenderer);
final ValueLabelRenderer currentRenderer = getLabelRenderer();
if (prevRenderer != currentRenderer) {
if (currentRenderer instanceof TypeRenderer) {
((TypeRenderer)currentRenderer).setClassName(getClassName());
}
}
}
public void setChildrenRenderer(ChildrenRenderer childrenRenderer) {
final ChildrenRenderer prevRenderer = getChildrenRenderer();
super.setChildrenRenderer(myRendererSettings.isBase(childrenRenderer) ? null : childrenRenderer);
final ChildrenRenderer currentRenderer = getChildrenRenderer();
if (prevRenderer != currentRenderer) {
if (currentRenderer instanceof TypeRenderer) {
((TypeRenderer)currentRenderer).setClassName(getClassName());
}
}
}
public ChildrenRenderer getChildrenRenderer() {
final ChildrenRenderer childrenRenderer = super.getChildrenRenderer();
return childrenRenderer != null ? childrenRenderer : getDefaultRenderer();
}
private NodeRenderer getDefaultRenderer() {
String name = getClassName();
if (TypeConversionUtil.isPrimitive(name)) {
return myRendererSettings.getPrimitiveRenderer();
}
return name.endsWith("]") ? myRendererSettings.getArrayRenderer() : myRendererSettings.getClassRenderer();
}
public ValueLabelRenderer getLabelRenderer() {
final ValueLabelRenderer labelRenderer = super.getLabelRenderer();
return labelRenderer != null ? labelRenderer : getDefaultRenderer();
}
private ChildrenRenderer getRawChildrenRenderer() {
NodeRenderer classRenderer = getDefaultRenderer();
final ChildrenRenderer originalRenderer = super.getChildrenRenderer();
return originalRenderer == classRenderer ? null : originalRenderer;
}
private ValueLabelRenderer getRawLabelRenderer() {
NodeRenderer classRenderer = getDefaultRenderer();
final ValueLabelRenderer originalRenderer = super.getLabelRenderer();
return originalRenderer == classRenderer ? null : originalRenderer;
}
public boolean isApplicable(Type type) {
if (DebuggerUtils.instanceOf(type, getClassName())) {
return super.isApplicable(type);
}
return false;
}
@Override
public String getUniqueId() {
return UNIQUE_ID;
}
public void setClassName(@NotNull String name) {
myProperties.setClassName(name);
if (getRawLabelRenderer() != null) {
final ValueLabelRenderer originalLabelRenderer = super.getLabelRenderer();
if (originalLabelRenderer instanceof TypeRenderer) {
((TypeRenderer)originalLabelRenderer).setClassName(name);
}
}
if (getRawChildrenRenderer() != null) {
final ChildrenRenderer originalChildrenRenderer = super.getChildrenRenderer();
if (originalChildrenRenderer instanceof TypeRenderer) {
((TypeRenderer)originalChildrenRenderer).setClassName(name);
}
}
}
public
@NotNull
String getClassName() {
return myProperties.getClassName();
}
protected final PsiElement getContext(Project project, DebuggerContext context) {
DebugProcess process = context.getDebugProcess();
GlobalSearchScope scope = process != null ? process.getSearchScope() : GlobalSearchScope.allScope(project);
return DebuggerUtils.findClass(getClassName(), project, scope);
}
protected final PsiElement getChildValueExpression(String text, DebuggerTreeNode node, DebuggerContext context) {
Project project = node.getProject();
PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
return elementFactory.createExpressionFromText(text, getContext(project, context));
}
}
@@ -41,7 +41,7 @@ import java.util.List;
* Date: Dec 19, 2003
* Time: 1:25:15 PM
*/
public final class EnumerationChildrenRenderer extends ReferenceRenderer implements ChildrenRenderer{
public final class EnumerationChildrenRenderer extends TypeRenderer implements ChildrenRenderer{
public static final @NonNls String UNIQUE_ID = "EnumerationChildrenRenderer";
private boolean myAppendDefaultChildren;
@@ -50,7 +50,7 @@ import java.util.List;
* Date: Sep 17, 2003
* Time: 2:04:00 PM
*/
public class ExpressionChildrenRenderer extends ReferenceRenderer implements ChildrenRenderer {
public class ExpressionChildrenRenderer extends TypeRenderer implements ChildrenRenderer {
public static final @NonNls String UNIQUE_ID = "ExpressionChildrenRenderer";
private static final Key<Value> EXPRESSION_VALUE = new Key<>("EXPRESSION_VALUE");
private static final Key<NodeRenderer> LAST_CHILDREN_RENDERER = new Key<>("LAST_CHILDREN_RENDERER");
@@ -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,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.sun.jdi.PrimitiveValue;
import com.sun.jdi.Value;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
@@ -40,7 +39,7 @@ import javax.swing.*;
* Date: Sep 20, 2003
* Time: 10:27:12 PM
*/
public class LabelRenderer extends ReferenceRenderer implements ValueLabelRenderer{
public class LabelRenderer extends TypeRenderer implements ValueLabelRenderer{
public static final @NonNls String UNIQUE_ID = "LabelRenderer";
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.impl.watch.render.ClassLabelRenderer");
@@ -69,7 +68,6 @@ public class LabelRenderer extends ReferenceRenderer implements ValueLabelRender
throws EvaluateException {
final Value value = descriptor.getValue();
LOG.assertTrue(!(value instanceof PrimitiveValue));
String result;
final DebugProcess debugProcess = evaluationContext.getDebugProcess();
@@ -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.
@@ -16,64 +16,19 @@
package com.intellij.debugger.ui.tree.render;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.CommonClassNames;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.Type;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
public abstract class ReferenceRenderer implements Renderer {
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ReferenceRenderer");
protected BasicRendererProperties myProperties = new BasicRendererProperties();
public abstract class ReferenceRenderer extends TypeRenderer {
protected ReferenceRenderer() {
this(CommonClassNames.JAVA_LANG_OBJECT);
}
protected ReferenceRenderer(@NotNull String className) {
myProperties.setClassName(className);
}
public String getClassName() {
return myProperties.getClassName();
}
public void setClassName(String className) {
myProperties.setClassName(className);
}
public Renderer clone() {
try {
final ReferenceRenderer cloned = (ReferenceRenderer)super.clone();
cloned.myProperties = myProperties.clone();
return cloned;
}
catch (CloneNotSupportedException e) {
LOG.error(e);
}
return null;
super(className);
}
public boolean isApplicable(Type type) {
return type != null && type instanceof ReferenceType && DebuggerUtils.instanceOf(type, getClassName());
}
public void writeExternal(Element element) throws WriteExternalException {
myProperties.writeExternal(element);
}
public void readExternal(Element element) throws InvalidDataException {
myProperties.readExternal(element);
}
protected CachedEvaluator createCachedEvaluator() {
return new CachedEvaluator() {
protected String getClassName() {
return ReferenceRenderer.this.getClassName();
}
};
return type instanceof ReferenceType && DebuggerUtils.instanceOf(type, getClassName());
}
}
@@ -0,0 +1,78 @@
/*
* 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.debugger.ui.tree.render;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.CommonClassNames;
import com.sun.jdi.Type;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
public abstract class TypeRenderer implements Renderer {
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ReferenceRenderer");
protected BasicRendererProperties myProperties = new BasicRendererProperties();
protected TypeRenderer() {
this(CommonClassNames.JAVA_LANG_OBJECT);
}
protected TypeRenderer(@NotNull String className) {
myProperties.setClassName(className);
}
public String getClassName() {
return myProperties.getClassName();
}
public void setClassName(String className) {
myProperties.setClassName(className);
}
public Renderer clone() {
try {
final TypeRenderer cloned = (TypeRenderer)super.clone();
cloned.myProperties = myProperties.clone();
return cloned;
}
catch (CloneNotSupportedException e) {
LOG.error(e);
}
return null;
}
public boolean isApplicable(Type type) {
return DebuggerUtils.instanceOf(type, getClassName());
}
public void writeExternal(Element element) throws WriteExternalException {
myProperties.writeExternal(element);
}
public void readExternal(Element element) throws InvalidDataException {
myProperties.readExternal(element);
}
protected CachedEvaluator createCachedEvaluator() {
return new CachedEvaluator() {
protected String getClassName() {
return TypeRenderer.this.getClassName();
}
};
}
}