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; } } }