/*******************************************************************************
* Copyright (c) 2004 Vlad Dumitrescu and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.backend.debug.model;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.erlide.backend.debug.ErlideDebug;
import org.erlide.backend.internal.BackendActivator;
import com.ericsson.otp.erlang.OtpErlangBinary;
import com.ericsson.otp.erlang.OtpErlangList;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangString;
import com.ericsson.otp.erlang.OtpErlangTuple;
public class ErlangVariable extends ErlangDebugElement implements IVariable {
private final String name;
private final boolean subVariable;
private final ErlangValue value;
private final ErlangProcess process;
private final int stackFrameNo;
public ErlangVariable(final IDebugTarget target, final String name,
final boolean subVariable, final OtpErlangObject value,
final ErlangProcess process, final String moduleName,
final int stackFrameNo) {
super(target);
this.name = name;
this.subVariable = subVariable;
this.value = createErlangValue(name, value, process, moduleName);
this.process = process;
this.stackFrameNo = stackFrameNo;
}
private ErlangValue createErlangValue(final String aname,
final OtpErlangObject avalue, final ErlangProcess aprocess,
final String moduleName) {
if (avalue instanceof OtpErlangList || avalue instanceof OtpErlangTuple
|| avalue instanceof OtpErlangBinary
|| avalue instanceof OtpErlangString) {
return new IndexedErlangValue(getDebugTarget(), aname, avalue, aprocess,
moduleName);
}
return new ErlangValue(getDebugTarget(), aname, avalue, aprocess, moduleName);
}
@Override
public IValue getValue() throws DebugException {
return value;
}
@Override
public String getName() throws DebugException {
return name;
}
@Override
public String getReferenceTypeName() throws DebugException {
if (value == null) {
return null;
}
return value.getReferenceTypeName();
}
@Override
public boolean hasValueChanged() throws DebugException {
return false;
}
@Override
public void setValue(final String expression) throws DebugException {
if (subVariable) {
throw new DebugException(new Status(IStatus.ERROR, BackendActivator.PLUGIN_ID,
DebugException.NOT_SUPPORTED, "Can't set value of part of expression",
null));
}
final ErlangDebugTarget edt = getErlangDebugTarget();
final String err = ErlideDebug.setVariableValue(edt.getBackend().getOtpRpc(),
name, expression, stackFrameNo - 1, process.getMeta());
if (err != null) {
// restore old value
ErlideDebug.setVariableValue(edt.getBackend().getOtpRpc(), name,
value.toString(), stackFrameNo - 1, process.getMeta());
throw new DebugException(new Status(IStatus.ERROR, BackendActivator.PLUGIN_ID,
DebugException.TARGET_REQUEST_FAILED, "Bad expression", null));
}
}
@Override
public void setValue(final IValue value) throws DebugException {
setValue(value.toString());
}
@Override
public boolean supportsValueModification() {
return !subVariable;
}
@Override
public boolean verifyValue(final String expression) throws DebugException {
return true;
}
@Override
public boolean verifyValue(final IValue aValue) throws DebugException {
return verifyValue(aValue.toString());
}
}