package jetbrains.mps.debugger.java.runtime.evaluation.proxies; /*Generated by MPS */ import jetbrains.mps.debugger.java.api.evaluation.proxies.ValueProxy; import jetbrains.mps.debugger.java.api.evaluation.proxies.IArrayValueProxy; import jetbrains.mps.debugger.java.api.evaluation.proxies.IObjectValueProxy; import com.sun.jdi.ArrayReference; import org.jetbrains.annotations.NotNull; import jetbrains.mps.debugger.java.api.evaluation.proxies.IValueProxy; import jetbrains.mps.debugger.java.api.evaluation.proxies.MirrorUtil; import jetbrains.mps.debugger.java.api.evaluation.EvaluationUtils; import com.sun.jdi.Value; import jetbrains.mps.debugger.java.api.evaluation.EvaluationException; import com.sun.jdi.InvalidTypeException; import com.sun.jdi.ClassNotLoadedException; import com.sun.jdi.ThreadReference; import com.sun.jdi.ClassType; import com.sun.jdi.Method; import java.util.List; import com.sun.jdi.InvocationException; import com.sun.jdi.IncompatibleThreadStateException; import jetbrains.mps.debugger.java.api.evaluation.proxies.INullValueProxy; /*package*/ class ArrayValueProxy extends ValueProxy implements IArrayValueProxy, IObjectValueProxy { public ArrayValueProxy(ArrayReference value) { super(value); } @NotNull private ArrayReference getArrayValue() { return (ArrayReference) myValue; } @Override public IValueProxy getFieldValue(String fieldName) { assert false : "Arrays can't have fields."; return null; } @NotNull @Override public IValueProxy getElementAt(int index) { return MirrorUtil.getInstance().getValueProxy(EvaluationUtils.getInstance().getArrayElementAt(getArrayValue(), index)); } @Override public void setElement(Value element, int index) throws EvaluationException { try { getArrayValue().setValue(index, element); } catch (InvalidTypeException e) { throw new EvaluationException("Error setting array element at " + index, e); } catch (ClassNotLoadedException e) { throw new EvaluationException("Error setting array element at " + index, e); } } @Override public int getLength() { return getArrayValue().length(); } @Override public IValueProxy invokeMethod(String name, String jniSignature, final ThreadReference threadReference, Object... args) throws EvaluationException { // we can't use Evaluators similar method cause we find methods in Object, but invoke them for Array ClassType objectType = (ClassType) EvaluationUtils.getInstance().findClassType("java.lang.Object", myValue.virtualMachine()); final Method method = EvaluationUtils.getInstance().findMethod(objectType, name, jniSignature); final List<Value> argValues = MirrorUtil.getInstance().getValues(myValue.virtualMachine(), args); return EvaluationUtils.handleInvocationExceptions(new EvaluationUtils.ThreadInvocatable<IValueProxy>(threadReference) { @Override public IValueProxy invoke() throws InvocationException, InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException { Value result = getArrayValue().invokeMethod(threadReference, method, argValues, 0); return MirrorUtil.getInstance().getValueProxy(result); } }); } @Override public IValueProxy invokeSuperMethod(String name, String jniSignature, ThreadReference threadRefence, Object... args) { throw new UnsupportedOperationException("Can't invoke super for an array"); } @Override public boolean isInstanceOf(String typename) throws EvaluationException { return EvaluationUtils.getInstance().instanceOf(myValue.type(), typename, myValue.virtualMachine()); } @Override public boolean javaEquals(IValueProxy proxy) { if (proxy == null || proxy instanceof INullValueProxy) { return false; } return myValue.equals(proxy.getJDIValue()); } public String getPresentation() { return (("{" + myValue.type().name() + "} ") + myValue.toString()); } }