summaryrefslogtreecommitdiff
path: root/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java')
-rw-r--r--java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java111
1 files changed, 80 insertions, 31 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 0a691d332207..9cfb2bfde84e 100644
--- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java
+++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java
@@ -36,21 +36,30 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.CommonClassNames;
import com.intellij.psi.PsiExpression;
+import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.xdebugger.frame.*;
import com.intellij.xdebugger.frame.presentation.XRegularValuePresentation;
import com.intellij.xdebugger.frame.presentation.XStringValuePresentation;
import com.intellij.xdebugger.frame.presentation.XValuePresentation;
+import com.intellij.xdebugger.impl.evaluate.XValueCompactPresentation;
+import com.intellij.xdebugger.impl.ui.XValueTextProvider;
+import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
+import com.sun.jdi.ArrayReference;
+import com.sun.jdi.ArrayType;
+import com.sun.jdi.Value;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.util.ArrayList;
import java.util.List;
/**
* @author egor
*/
-public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
+public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XValueTextProvider {
private static final Logger LOG = Logger.getInstance(JavaValue.class);
private final JavaValue myParent;
@@ -74,7 +83,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
return new JavaValue(parent, valueDescriptor, evaluationContext, nodeManager);
}
- static JavaValue create(@NotNull ValueDescriptorImpl valueDescriptor,
+ public static JavaValue create(@NotNull ValueDescriptorImpl valueDescriptor,
EvaluationContextImpl evaluationContext,
NodeManagerImpl nodeManager) {
return create(null, valueDescriptor, evaluationContext, nodeManager, true);
@@ -156,7 +165,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
});
}
- private static class JavaValuePresentation extends XValuePresentation {
+ private static class JavaValuePresentation extends XValuePresentation implements XValueCompactPresentation {
private final String myValue;
private final String myType;
private final String myError;
@@ -175,6 +184,12 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
@Override
public void renderValue(@NotNull XValueTextRenderer renderer) {
+ renderValue(renderer, null);
+ }
+
+ @Override
+ public void renderValue(@NotNull XValueTextRenderer renderer, @Nullable XValueNodeImpl node) {
+ boolean compact = node != null;
if (myError != null) {
if (myValue.endsWith(myError)) {
renderer.renderValue(myValue.substring(0, myValue.length() - myError.length()));
@@ -182,6 +197,34 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
renderer.renderError(myError);
}
else {
+ if (compact && node.getValueContainer() instanceof JavaValue) {
+ final JavaValue container = (JavaValue)node.getValueContainer();
+
+ if (container.getDescriptor().isArray()) {
+ final ArrayReference value = (ArrayReference)container.getDescriptor().getValue();
+ final ArrayType type = (ArrayType)container.getDescriptor().getType();
+ if (type != null) {
+ final String typeName = type.componentTypeName();
+ if (TypeConversionUtil.isPrimitive(typeName) || CommonClassNames.JAVA_LANG_STRING.equals(typeName)) {
+ int max = CommonClassNames.JAVA_LANG_STRING.equals(typeName) ? 5 : 10;
+ final List<Value> values = value.getValues();
+ int i = 0;
+ final List<String> vals = new ArrayList<String>(max);
+ while (i < values.size() && i <= max) {
+ vals.add(StringUtil.first(values.get(i).toString(), 15, true));
+ i++;
+ }
+ String more = "";
+ if (vals.size() < values.size()) {
+ more = ", + " + (values.size() - vals.size()) + " more";
+ }
+
+ renderer.renderValue("{" + StringUtil.join(vals, ", ") + more + "}");
+ return;
+ }
+ }
+ }
+ }
renderer.renderValue(myValue);
}
}
@@ -269,23 +312,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
children.add(create(JavaValue.this, (ValueDescriptorImpl)descriptor, myEvaluationContext, myNodeManager, false));
}
else if (descriptor instanceof MessageDescriptor) {
- children.add("", new XValue() {
- @Override
- public void computePresentation(@NotNull XValueNode node, @NotNull XValuePlace place) {
- node.setPresentation(null, new XValuePresentation() {
- @NotNull
- @Override
- public String getSeparator() {
- return "";
- }
-
- @Override
- public void renderValue(@NotNull XValueTextRenderer renderer) {
- renderer.renderValue(descriptor.getLabel());
- }
- }, false);
- }
- });
+ children.add(new JavaStackFrame.DummyMessageValueNode(descriptor.getLabel(), null));
}
}
}
@@ -299,19 +326,36 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
}
@Override
- public void computeSourcePosition(@NotNull XNavigatable navigatable) {
- if (myValueDescriptor instanceof FieldDescriptorImpl) {
- SourcePosition position = ((FieldDescriptorImpl)myValueDescriptor).getSourcePosition(getProject(), getDebuggerContext());
- if (position != null) {
- navigatable.setSourcePosition(DebuggerUtilsEx.toXSourcePosition(position));
+ public void computeSourcePosition(@NotNull final XNavigatable navigatable) {
+ if (myEvaluationContext.getSuspendContext().isResumed()) return;
+ myEvaluationContext.getDebugProcess().getManagerThread().schedule(new SuspendContextCommandImpl(myEvaluationContext.getSuspendContext()) {
+ @Override
+ public Priority getPriority() {
+ return Priority.NORMAL;
}
- }
- if (myValueDescriptor instanceof LocalVariableDescriptorImpl) {
- SourcePosition position = ((LocalVariableDescriptorImpl)myValueDescriptor).getSourcePosition(getProject(), getDebuggerContext());
- if (position != null) {
- navigatable.setSourcePosition(DebuggerUtilsEx.toXSourcePosition(position));
+
+ @Override
+ public void contextAction() throws Exception {
+ ApplicationManager.getApplication().runReadAction(new Runnable() {
+ @Override
+ public void run() {
+ if (myValueDescriptor instanceof FieldDescriptorImpl) {
+ SourcePosition position = ((FieldDescriptorImpl)myValueDescriptor).getSourcePosition(getProject(), getDebuggerContext());
+ if (position != null) {
+ navigatable.setSourcePosition(DebuggerUtilsEx.toXSourcePosition(position));
+ }
+ }
+ if (myValueDescriptor instanceof LocalVariableDescriptorImpl) {
+ SourcePosition position =
+ ((LocalVariableDescriptorImpl)myValueDescriptor).getSourcePosition(getProject(), getDebuggerContext());
+ if (position != null) {
+ navigatable.setSourcePosition(DebuggerUtilsEx.toXSourcePosition(position));
+ }
+ }
+ }
+ });
}
- }
+ });
}
private DebuggerContextImpl getDebuggerContext() {
@@ -393,4 +437,9 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider {
}
return evaluationExpression;
}
+
+ @Override
+ public String getValueText() {
+ return myValueDescriptor.getValueText();
+ }
}