some pretty-printing

This commit is contained in:
Eugene Zhuravlev
2005-02-08 19:51:19 +03:00
parent a504fd27c9
commit fb713c4ad9
13 changed files with 98 additions and 94 deletions
@@ -4,19 +4,12 @@ import com.intellij.debugger.ui.tree.*;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: lex
* Date: Mar 17, 2004
* Time: 7:47:10 PM
* To change this template use File | Settings | File Templates.
*/
public interface ChildrenBuilder {
NodeDescriptorFactory getDescriptorManager();
NodeManager getNodeManager ();
NodeDescriptorFactory getDescriptorManager();
NodeManager getNodeManager();
ValueDescriptor getParentDescriptor ();
ValueDescriptor getParentDescriptor();
void setChildren(List<DebuggerTreeNode> children);
}
@@ -11,11 +11,6 @@ import com.intellij.debugger.DebuggerContext;
import com.sun.jdi.Value;
import com.sun.tools.corba.se.idl.constExpr.EvaluationException;
/**
* User: lex
* Date: Sep 20, 2003
* Time: 10:12:01 PM
*/
public interface ChildrenRenderer extends Renderer {
ChildrenRenderer clone();
@@ -27,13 +22,13 @@ public interface ChildrenRenderer extends Renderer {
* + node
* + ...
*
* function is invoked for the renderer in parenNode
* returns expression that evaluates node
* use 'this' to refer expression that evaluate parentNode
@param node -
* is invoked on the renderer of the parentNode
* @param node a child node
* @return expression that evaluates the child node.
* Use 'this' to refer the expression that evaluates this (parent) node
* @param context
*/
PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException;
PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException;
boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor);
}
@@ -30,10 +30,10 @@ public class CompoundNodeRenderer implements NodeRenderer{
public static final String UNIQUE_ID = "CompoundNodeRenderer";
private String myName;
private RendererProvider myRendererProvider;
private RendererProvider myRendererProvider;
protected ValueLabelRenderer myLabelRenderer;
protected ChildrenRenderer myChildrenRenderer;
protected ValueLabelRenderer myLabelRenderer;
protected ChildrenRenderer myChildrenRenderer;
public CompoundNodeRenderer(RendererProvider provider, String name, ValueLabelRenderer labelRenderer, ChildrenRenderer childrenRenderer) {
myRendererProvider = provider;
@@ -75,8 +75,8 @@ public class CompoundNodeRenderer implements NodeRenderer{
getChildrenRenderer().buildChildren(value, builder, evaluationContext);
}
public PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
return getChildrenRenderer().getChildrenValueExpression(node, context);
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
return getChildrenRenderer().getChildValueExpression(node, context);
}
public boolean isExpandable(Value value, EvaluationContext evaluationContext, NodeDescriptor parentDescriptor) {
@@ -109,7 +109,9 @@ public class CompoundNodeRenderer implements NodeRenderer{
public void readExternal(Element element) throws InvalidDataException {
myName = element.getAttributeValue("NAME");
if(myName == null) myName = "<unknown>";
if(myName == null) {
myName = "<unknown>";
}
List<Element> children = element.getChildren();
myLabelRenderer = (ValueLabelRenderer) NodeRendererExternalizer.readRenderer(children.get(0));
myChildrenRenderer = (ChildrenRenderer) NodeRendererExternalizer.readRenderer(children.get(1));
@@ -1,7 +1,5 @@
package com.intellij.debugger.ui.tree.render;
import com.intellij.openapi.util.JDOMExternalizable;
/*
* Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved.
* Use is subject to license terms.
@@ -4,11 +4,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.JDOMExternalizable;
import com.sun.jdi.Type;
/**
* User: lex
* Date: Nov 19, 2003
* Time: 5:39:53 PM
*/
public interface Renderer extends Cloneable, JDOMExternalizable {
RendererProvider getRendererProvider();
@@ -17,9 +12,8 @@ public interface Renderer extends Cloneable, JDOMExternalizable {
/***
* Checks whether this renderer is apllicable to this value
* @param type
* @return
*/
public boolean isApplicable(Type type);
public boolean isApplicable(Type type);
public Object clone() throws CloneNotSupportedException;
}
@@ -27,7 +27,7 @@ public abstract class TreeBuilder implements TreeModel {
return userObject;
}
protected abstract void buildChildren(TreeBuilderNode node);
protected abstract void buildChildren(TreeBuilderNode node);
protected abstract boolean isExpandable (TreeBuilderNode node);
public void setRoot(TreeBuilderNode root) {
@@ -21,6 +21,7 @@ import com.intellij.debugger.ui.impl.DebuggerTreeBase;
import com.intellij.debugger.ui.impl.tree.TreeBuilder;
import com.intellij.debugger.ui.impl.tree.TreeBuilderNode;
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
import com.intellij.debugger.ui.tree.NodeDescriptor;
import com.intellij.debugger.ui.tree.render.ChildrenBuilder;
import com.intellij.debugger.ui.tree.render.NodeRendererSettings;
import com.intellij.debugger.ui.tree.render.NodeRendererSettingsListener;
@@ -66,8 +67,11 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi
myDescriptorManager = new NodeManagerImpl(project, this);
TreeBuilder model = new TreeBuilder(this) {
protected void buildChildren(TreeBuilderNode node) {
if (((DebuggerTreeNodeImpl)node).getDescriptor() instanceof DefaultNodeDescriptor) return;
buildNode((DebuggerTreeNodeImpl)node);
final DebuggerTreeNodeImpl debuggerTreeNode = (DebuggerTreeNodeImpl)node;
if (debuggerTreeNode.getDescriptor() instanceof DefaultNodeDescriptor) {
return;
}
buildNode(debuggerTreeNode);
}
protected boolean isExpandable(TreeBuilderNode builderNode) {
@@ -145,7 +149,9 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi
private void buildNode(final DebuggerTreeNodeImpl node) {
if (node == null || node.getDescriptor() == null) return;
if (node == null || node.getDescriptor() == null) {
return;
}
BuildNodeCommand builder = getBuildNodeCommand(node);
builder.getNode().add(myDescriptorManager.createMessageNode(MessageDescriptor.EVALUATING));
@@ -526,28 +532,32 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi
public void threadAction() {
try {
StackFrameDescriptorImpl stackDescriptor = (StackFrameDescriptorImpl)getNode().getDescriptor();
StackFrameProxyImpl frame = stackDescriptor.getStackFrame();
if(!getDebuggerContext().getDebugProcess().getSuspendManager().isSuspended(frame.threadProxy())) return;
final StackFrameDescriptorImpl stackDescriptor = (StackFrameDescriptorImpl)getNode().getDescriptor();
final StackFrameProxyImpl frame = stackDescriptor.getStackFrame();
final DebuggerContextImpl debuggerContext = getDebuggerContext();
if(!debuggerContext.getDebugProcess().getSuspendManager().isSuspended(frame.threadProxy())) {
return;
}
LOG.assertTrue(frame.threadProxy().isSuspended());
final ObjectReference thisObjectReference = frame.thisObject();
ObjectReference thisObjectReference = frame.thisObject();
EvaluationContextImpl evaluationContext = getDebuggerContext().createEvaluationContext();
final EvaluationContextImpl evaluationContext = debuggerContext.createEvaluationContext();
final NodeDescriptor descriptor;
if (thisObjectReference != null) {
myChildren.add(myDescriptorManager.createNode(myDescriptorManager.getThisDescriptor(stackDescriptor, thisObjectReference), evaluationContext));
descriptor = myDescriptorManager.getThisDescriptor(stackDescriptor, thisObjectReference);
}
else {
ReferenceType type = frame.location().method().declaringType();
myChildren.add(myDescriptorManager.createNode(myDescriptorManager.getStaticDescriptor(stackDescriptor, type), evaluationContext));
final ReferenceType type = frame.location().method().declaringType();
descriptor = myDescriptorManager.getStaticDescriptor(stackDescriptor, type);
}
myChildren.add(myDescriptorManager.createNode(descriptor, evaluationContext));
try {
for (Iterator<LocalVariableProxyImpl> iterator = frame.visibleVariables().iterator(); iterator.hasNext();) {
LocalVariableProxyImpl local = iterator.next();
myChildren.add(myDescriptorManager.createNode(myDescriptorManager.getLocalVariableDescriptor(stackDescriptor, local), evaluationContext));
final LocalVariableProxyImpl local = iterator.next();
final LocalVariableDescriptorImpl localVariableDescriptor = myDescriptorManager.getLocalVariableDescriptor(stackDescriptor, local);
final DebuggerTreeNodeImpl variableNode = myDescriptorManager.createNode(localVariableDescriptor, evaluationContext);
myChildren.add(variableNode);
}
}
catch (EvaluateException e) {
@@ -113,39 +113,37 @@ public class DebuggerTreeNodeImpl extends TreeBuilderNode implements DebuggerTre
}
labelChanged();
if(!labelOnly) childrenChanged();
if(!labelOnly) {
childrenChanged();
}
}
public void calcLabel() {
final DebuggerContextImpl context = getTree().getDebuggerContext();
update(
context,
new Runnable() {
public void run() {
getDescriptor().updateRepresentation(context.createEvaluationContext(), new DescriptorLabelListener() {
public void labelChanged() {
updateCaches();
DebuggerTreeNodeImpl.this.labelChanged();
}
});
}
}, true);
update(context, new Runnable() {
public void run() {
getDescriptor().updateRepresentation(context.createEvaluationContext(), new DescriptorLabelListener() {
public void labelChanged() {
updateCaches();
DebuggerTreeNodeImpl.this.labelChanged();
}
});
}
}, true);
}
public void calcRepresentation() {
final DebuggerContextImpl context = getTree().getDebuggerContext();
update(
context,
new Runnable() {
public void run() {
getDescriptor().updateRepresentation(context.createEvaluationContext(), new DescriptorLabelListener() {
public void labelChanged() {
updateCaches();
DebuggerTreeNodeImpl.this.labelChanged();
}
});
}
}, false);
update(context, new Runnable() {
public void run() {
getDescriptor().updateRepresentation(context.createEvaluationContext(), new DescriptorLabelListener() {
public void labelChanged() {
updateCaches();
DebuggerTreeNodeImpl.this.labelChanged();
}
});
}
}, false);
}
public void calcValue() {
@@ -52,12 +52,18 @@ public class FieldDescriptorImpl extends ValueDescriptorImpl implements FieldDes
// this field actually mirrors a local variable in the outer class
String varName = fieldName.substring(fieldName.lastIndexOf('$') + 1);
PsiElement element = PositionUtil.getContextElement(context);
if (element == null) return null;
if (element == null) {
return null;
}
PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class, false);
if (aClass == null) return null;
if (aClass == null) {
return null;
}
aClass = (PsiClass) aClass.getNavigationElement();
PsiVariable psiVariable = psiManager.getResolveHelper().resolveReferencedVariable(varName, aClass);
if (psiVariable == null) return null;
if (psiVariable == null) {
return null;
}
return SourcePosition.createFromOffset(psiVariable.getContainingFile(), psiVariable.getTextOffset());
}
else {
@@ -189,8 +189,9 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements
public NodeRenderer getRenderer (DebugProcessImpl debugProcess) {
DebuggerManagerThreadImpl.assertIsManagerThread();
Type type = getType();
if(type != null && myRenderer != null && myRenderer.isApplicable(type))
if(type != null && myRenderer != null && myRenderer.isApplicable(type)) {
return myRenderer;
}
myAutoRenderer = debugProcess.getNodeRendererManager().getAutoRenderer(this);
return myAutoRenderer;
@@ -210,7 +211,7 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements
PsiExpression parentEvaluation = vDescriptor.getTreeEvaluation((DebuggerTreeNodeImpl)debuggerTreeNode.getParent(), context);
return DebuggerTreeNodeExpression.substituteThis(
vDescriptor.getRenderer(context.getDebugProcess()).getChildrenValueExpression(debuggerTreeNode, context),
vDescriptor.getRenderer(context.getDebugProcess()).getChildValueExpression(debuggerTreeNode, context),
parentEvaluation, vDescriptor.getValue());
}
else {
@@ -159,7 +159,7 @@ public class ArrayRenderer extends ReferenceRenderer implements NodeRenderer, Cl
DefaultJDOMExternalizer.writeExternal(this, element);
}
public PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) {
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) {
LOG.assertTrue(node.getDescriptor() instanceof ArrayElementDescriptorImpl, node.getDescriptor().getClass().getName());
ArrayElementDescriptorImpl descriptor = (ArrayElementDescriptorImpl)node.getDescriptor();
@@ -79,7 +79,8 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
}
else if(value == null) {
return "null";
} else {
}
else {
return "undefined";
}
}
@@ -87,7 +88,7 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
public void buildChildren(final Value value, final ChildrenBuilder builder, final EvaluationContext evaluationContext) {
DebuggerManagerThreadImpl.assertIsManagerThread();
final ValueDescriptorImpl parentDescriptor = (ValueDescriptorImpl)builder.getParentDescriptor();
final NodeManager nodeManager = builder.getNodeManager();
final NodeManager nodeManager = builder.getNodeManager();
final NodeDescriptorFactory nodeDescriptorFactory = builder.getDescriptorManager();
List<DebuggerTreeNode> children = new ArrayList<DebuggerTreeNode>();
@@ -95,18 +96,21 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
final ObjectReference objRef = (ObjectReference)value;
final ReferenceType refType = objRef.referenceType();
// default ObjectReference processing
List fields = refType.allFields();
final List fields = refType.allFields();
if (fields.size() > 0) {
for (Iterator it = fields.iterator(); it.hasNext();) {
Field jdiField = (Field)it.next();
if (!shouldDisplay(jdiField)) continue;
if (!shouldDisplay(jdiField)) {
continue;
}
children.add(nodeManager.createNode(nodeDescriptorFactory.getFieldDescriptor(parentDescriptor, objRef, jdiField), evaluationContext));
}
if(SORT_ASCENDING) {
Collections.sort(children, NodeManagerImpl.getNodeComparator());
}
} else {
}
else {
children.add(nodeManager.createMessageNode(MessageDescriptor.CLASS_HAS_NO_FIELDS.getLabel()));
}
}
@@ -146,7 +150,7 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
DefaultJDOMExternalizer.writeExternal(this, element);
}
public PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) throws EvaluateException {
FieldDescriptor fieldDescriptor = (FieldDescriptor)node.getDescriptor();
PsiElementFactory elementFactory = PsiManager.getInstance(node.getProject()).getElementFactory();
@@ -162,7 +166,8 @@ public class ClassRenderer extends ReferenceRenderer implements NodeRenderer{
try {
if(value instanceof ArrayReference) {
return ((ArrayReference)value).length() > 0;
} else if(value instanceof ObjectReference) {
}
else if(value instanceof ObjectReference) {
return ((ObjectReference)value).referenceType().allFields().size() > 0;
}
}
@@ -66,7 +66,8 @@ public class PrimitiveRenderer implements NodeRenderer, Cloneable {
Value value = valueDescriptor.getValue();
if(value == null) {
return "null";
} else if (value instanceof PrimitiveValue) {
}
else if (value instanceof PrimitiveValue) {
StringBuffer buf = new StringBuffer(16);
if (value instanceof CharValue) {
buf.append("'");
@@ -91,7 +92,8 @@ public class PrimitiveRenderer implements NodeRenderer, Cloneable {
buf.append(DebuggerUtilsEx.translateStringValue(value.toString()));
}
return buf.toString();
} else {
}
else {
return "undefined";
}
}
@@ -116,7 +118,7 @@ public class PrimitiveRenderer implements NodeRenderer, Cloneable {
return this;
}
public PsiExpression getChildrenValueExpression(DebuggerTreeNode node, DebuggerContext context) {
public PsiExpression getChildValueExpression(DebuggerTreeNode node, DebuggerContext context) {
LOG.assertTrue(false);
return null;
}