import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.SpeedSearchBase;
import com.intellij.ui.TreeSpeedSearch;
import com.sun.jdi.*;
descriptor = myNodeManager.getStaticDescriptor(stackDescriptor, type);
}
myChildren.add(myNodeManager.createNode(descriptor, evaluationContext));
+
+ if (thisObjectReference != null && evaluationContext.getDebugProcess().getVirtualMachineProxy().canGetSyntheticAttribute()) {
+ final ReferenceType thisRefType = thisObjectReference.referenceType();
+ if (thisRefType instanceof ClassType) {
+ final ClassType clsType = (ClassType)thisRefType;
+ for (Field field : clsType.fields()) {
+ if (field.isSynthetic() && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) {
+ final FieldDescriptorImpl fieldDescriptor = myNodeManager.getFieldDescriptor(stackDescriptor, thisObjectReference, field);
+ myChildren.add(myNodeManager.createNode(fieldDescriptor, evaluationContext));
+ }
+ }
+ }
+ }
+
try {
buildVariables(stackDescriptor, evaluationContext);
if (NodeRendererSettings.getInstance().getClassRenderer().SORT_ASCENDING) {
import org.jetbrains.annotations.NotNull;
public class FieldDescriptorImpl extends ValueDescriptorImpl implements FieldDescriptor{
+ public static final String OUTER_LOCAL_VAR_FIELD_PREFIX = "val$";
private final Field myField;
private final ObjectReference myObject;
private Boolean myIsPrimitive = null;
final ReferenceType type = myField.declaringType();
final JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
final String fieldName = myField.name();
- if (fieldName.startsWith("val$")) {
+ if (fieldName.startsWith(OUTER_LOCAL_VAR_FIELD_PREFIX)) {
// this field actually mirrors a local variable in the outer class
String varName = fieldName.substring(fieldName.lastIndexOf('$') + 1);
PsiElement element = PositionUtil.getContextElement(context);
}
public String getName() {
- return myField.name();
+ final String fieldName = myField.name();
+ return isOuterLocalVariableValue()? fieldName.substring(OUTER_LOCAL_VAR_FIELD_PREFIX.length()) : fieldName;
+ }
+
+ public boolean isOuterLocalVariableValue() {
+ try {
+ return DebuggerUtils.isSynthetic(myField) && myField.name().startsWith(OUTER_LOCAL_VAR_FIELD_PREFIX);
+ }
+ catch (UnsupportedOperationException e) {
+ return false;
+ }
}
public String calcValueName() {
}
else {
//noinspection HardCodedStringLiteral
- fieldName = "this." + getName();
+ fieldName = isOuterLocalVariableValue()? getName() : "this." + getName();
}
try {
- return (PsiReferenceExpression)elementFactory.createExpressionFromText(fieldName, null);
+ return elementFactory.createExpressionFromText(fieldName, null);
}
catch (IncorrectOperationException e) {
throw new EvaluateException(DebuggerBundle.message("error.invalid.field.name", getName()), e);
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.evaluation.EvaluationContext;
+import com.intellij.debugger.ui.impl.watch.FieldDescriptorImpl;
import com.intellij.debugger.ui.impl.watch.MessageDescriptor;
import com.intellij.debugger.ui.impl.watch.NodeManagerImpl;
import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiExpression;
builder.setChildren(children);
}
- private boolean shouldDisplay(TypeComponent component) {
- if (!SHOW_SYNTHETICS && DebuggerUtils.isSynthetic(component)) {
+ private boolean shouldDisplay(Field field) {
+ final boolean isSynthetic = DebuggerUtils.isSynthetic(field);
+ if (!SHOW_SYNTHETICS && isSynthetic) {
return false;
}
- if (!(component instanceof Field)) {
- return true;
+ if (isSynthetic && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) {
+ return false;
}
- final Field field = (Field)component;
-
if(!SHOW_STATIC && field.isStatic()) {
return false;
}