package jetbrains.mps.debugger.java.runtime.state.customViewers;
/*Generated by MPS */
import jetbrains.mps.debugger.java.api.state.proxy.ValueWrapperFactory;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.debugger.java.api.evaluation.proxies.IValueProxy;
import jetbrains.mps.debugger.java.api.evaluation.proxies.IObjectValueProxy;
import jetbrains.mps.debugger.java.api.state.proxy.ValueWrapper;
import com.sun.jdi.ThreadReference;
import java.util.List;
import jetbrains.mps.debug.api.programState.IWatchable;
import java.util.ArrayList;
import com.sun.jdi.ObjectReference;
import com.sun.jdi.Field;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.debugger.java.api.state.watchables.JavaWatchable;
import jetbrains.mps.debugger.java.api.state.proxy.JavaValue;
import jetbrains.mps.debugger.java.api.state.customViewers.CustomViewersManager;
import jetbrains.mps.debug.api.programState.IValue;
import javax.swing.Icon;
import jetbrains.mps.debug.api.programState.WatchablesCategory;
public class ObjectWrapperFactory extends ValueWrapperFactory {
@Override
public boolean canWrapValue(@NotNull IValueProxy value) {
return value instanceof IObjectValueProxy;
}
public ValueWrapper createValueWrapper(IValueProxy value, ThreadReference threadReference) {
return new ObjectWrapperFactory.JavaObjectValue((IObjectValueProxy) value, threadReference);
}
@Override
public String getName() {
return "Object";
}
public static class JavaObjectValue extends ValueWrapper<IObjectValueProxy> {
public JavaObjectValue(IObjectValueProxy value, ThreadReference threadReference) {
super(value, threadReference);
}
@Override
public List<IWatchable> getSubvaluesImpl() {
List<IWatchable> watchables = new ArrayList<IWatchable>();
ObjectReference ref = (ObjectReference) myValue.getJDIValue();
if (ref != null) {
List<Field> fieldList = ListSequence.fromList(new ArrayList<Field>());
ListSequence.fromList(fieldList).addSequence(ListSequence.fromList(ref.referenceType().allFields()));
for (Field f : ListSequence.fromList(fieldList).where(new IWhereFilter<Field>() {
public boolean accept(Field it) {
return !(it.isStatic());
}
}).sort(new ISelector<Field, String>() {
public String select(Field it) {
return it.name();
}
}, true)) {
watchables.add(new ObjectWrapperFactory.JavaField(f, ref, myThreadReference));
}
}
return watchables;
}
}
public static class JavaField extends JavaWatchable implements IWatchable {
private final Field myField;
private final ObjectReference myParent;
private final JavaValue myCachedValue;
private final String myName;
public JavaField(Field field, ObjectReference parent, ThreadReference threadReference) {
super(threadReference);
myField = field;
myParent = parent;
myCachedValue = CustomViewersManager.getInstance().fromJdi(myParent.getValue(myField), threadReference);
myName = calculateName();
}
public Field getField() {
return myField;
}
@Override
public String getName() {
return myName;
}
private String calculateName() {
String name = myField.name();
if (myField.isStatic() && !(myField.declaringType().name().equals(myParent.referenceType().name()))) {
name = name + " (" + myField.declaringType().name() + ")";
}
return name;
}
@Override
public IValue getValue() {
return myCachedValue;
}
@Override
public Icon getPresentationIcon() {
return getValue().getPresentationIcon();
}
@Override
public WatchablesCategory getCategory() {
return WatchablesCategory.NONE;
}
}
}