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