package jetbrains.mps.debugger.java.runtime.evaluation.proxies; /*Generated by MPS */ import jetbrains.mps.debugger.java.api.evaluation.proxies.MirrorUtil; import org.jetbrains.annotations.Nullable; import com.sun.jdi.Value; import com.sun.jdi.VirtualMachine; import org.jetbrains.annotations.NotNull; import com.sun.jdi.StringReference; import com.sun.jdi.PrimitiveValue; import com.sun.jdi.BooleanValue; import com.sun.jdi.ShortValue; import com.sun.jdi.ByteValue; import com.sun.jdi.CharValue; import com.sun.jdi.DoubleValue; import com.sun.jdi.FloatValue; import com.sun.jdi.IntegerValue; import com.sun.jdi.LongValue; import com.sun.jdi.ObjectReference; import com.sun.jdi.Field; import jetbrains.mps.debugger.java.api.evaluation.proxies.IValueProxy; import com.sun.jdi.VoidValue; import jetbrains.mps.debugger.java.api.evaluation.proxies.VoidValueProxy; import com.sun.jdi.ArrayReference; import jetbrains.mps.debugger.java.api.evaluation.proxies.PrimitiveValueProxy; import java.util.List; import java.util.ArrayList; import jetbrains.mps.debugger.java.api.evaluation.proxies.ValueProxy; public class MirrorUtilImpl extends MirrorUtil { public MirrorUtilImpl() { } @Nullable private Value getJDIValueFromRaw(@Nullable Object value, VirtualMachine vm) { if (value == null) { return null; } if (value instanceof Integer) { return vm.mirrorOf(((Integer) value).intValue()); } else if (value instanceof Byte) { return vm.mirrorOf(((Byte) value).byteValue()); } else if (value instanceof Boolean) { return vm.mirrorOf(((Boolean) value).booleanValue()); } else if (value instanceof Short) { return vm.mirrorOf(((Short) value).shortValue()); } else if (value instanceof Float) { return vm.mirrorOf(((Float) value).floatValue()); } else if (value instanceof Long) { return vm.mirrorOf(((Long) value).longValue()); } else if (value instanceof Double) { return vm.mirrorOf(((Double) value).doubleValue()); } else if (value instanceof Character) { return vm.mirrorOf(((Character) value).charValue()); } else if (value instanceof String) { return vm.mirrorOf((String) value); } else { throw new UnsupportedOperationException(); } } @NotNull @Override public Object getJavaValue(@NotNull Value jdiValue) { if (jdiValue instanceof StringReference) { return ((StringReference) jdiValue).value(); } if (jdiValue instanceof PrimitiveValue) { PrimitiveValue primitiveValue = (PrimitiveValue) jdiValue; if (primitiveValue instanceof BooleanValue) { return primitiveValue.booleanValue(); } if (primitiveValue instanceof ShortValue) { return primitiveValue.shortValue(); } if (primitiveValue instanceof ByteValue) { return primitiveValue.byteValue(); } if (primitiveValue instanceof CharValue) { return primitiveValue.charValue(); } if (primitiveValue instanceof DoubleValue) { return primitiveValue.doubleValue(); } if (primitiveValue instanceof FloatValue) { return primitiveValue.floatValue(); } if (primitiveValue instanceof IntegerValue) { return primitiveValue.intValue(); } if (primitiveValue instanceof LongValue) { return primitiveValue.longValue(); } } else if (jdiValue instanceof ObjectReference) { String typename = ((ObjectReference) jdiValue).referenceType().name(); if (typename.equals(Boolean.class.getName()) || typename.equals(Short.class.getName()) || typename.equals(Byte.class.getName()) || typename.equals(Character.class.getName()) || typename.equals(Double.class.getName()) || typename.equals(Float.class.getName()) || typename.equals(Integer.class.getName()) || typename.equals(Long.class.getName())) { Field f = ((ObjectReference) jdiValue).referenceType().fieldByName("value"); Value result = ((ObjectReference) jdiValue).getValue(f); return getJavaValue(result); } } throw new UnsupportedOperationException(); } @NotNull @Override public IValueProxy getValueProxyFromJava(@Nullable Object javaValue, VirtualMachine machine) { Value v = getJDIValueFromRaw(javaValue, machine); return getValueProxy(v); } @NotNull @Override public IValueProxy getValueProxy(@Nullable Value value) { if (value == null) { return new NullValueProxy(); } if (value instanceof VoidValue) { return new VoidValueProxy(value); } if (value instanceof ArrayReference) { return new ArrayValueProxy((ArrayReference) value); } else if (value instanceof ObjectReference) { return new ObjectValueProxy((ObjectReference) value); } else if (value instanceof PrimitiveValue) { return new PrimitiveValueProxy((PrimitiveValue) value); } else { throw new UnsupportedOperationException(); } } @NotNull @Override public List<Value> getValues(VirtualMachine machine, Object... args) { List<Value> argValues = new ArrayList<Value>(); for (Object arg : args) { Value v; if (arg instanceof ValueProxy) { v = ((IValueProxy) arg).getJDIValue(); } else { v = getJDIValueFromRaw(arg, machine); } argValues.add(v); } return argValues; } @Override public void dispose() { synchronized (LOCK) { INSTANCE = null; } } @Override public void init() { synchronized (LOCK) { INSTANCE = this; } } }