mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-26 02:15:31 +02:00
new constructor and cleanup
This commit is contained in:
parent
873f29c14c
commit
e67d9935f9
1 changed files with 106 additions and 20 deletions
|
@ -9,6 +9,8 @@ import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIExpressionManager;
|
import org.eclipse.cdt.debug.core.cdi.ICDIExpressionManager;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIRegisterManager;
|
import org.eclipse.cdt.debug.core.cdi.ICDIRegisterManager;
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIVariableManager;
|
import org.eclipse.cdt.debug.core.cdi.ICDIVariableManager;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayType;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayType;
|
||||||
|
@ -50,12 +52,14 @@ import org.eclipse.cdt.debug.mi.core.cdi.model.type.Type;
|
||||||
import org.eclipse.cdt.debug.mi.core.cdi.model.type.WCharValue;
|
import org.eclipse.cdt.debug.mi.core.cdi.model.type.WCharValue;
|
||||||
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
|
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
|
||||||
import org.eclipse.cdt.debug.mi.core.command.MIVarAssign;
|
import org.eclipse.cdt.debug.mi.core.command.MIVarAssign;
|
||||||
|
import org.eclipse.cdt.debug.mi.core.command.MIVarInfoExpression;
|
||||||
import org.eclipse.cdt.debug.mi.core.command.MIVarListChildren;
|
import org.eclipse.cdt.debug.mi.core.command.MIVarListChildren;
|
||||||
import org.eclipse.cdt.debug.mi.core.command.MIVarSetFormat;
|
import org.eclipse.cdt.debug.mi.core.command.MIVarSetFormat;
|
||||||
import org.eclipse.cdt.debug.mi.core.command.MIVarShowAttributes;
|
import org.eclipse.cdt.debug.mi.core.command.MIVarShowAttributes;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MIVarChangedEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MIVarChangedEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
|
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIVar;
|
import org.eclipse.cdt.debug.mi.core.output.MIVar;
|
||||||
|
import org.eclipse.cdt.debug.mi.core.output.MIVarInfoExpressionInfo;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIVarListChildrenInfo;
|
import org.eclipse.cdt.debug.mi.core.output.MIVarListChildrenInfo;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIVarShowAttributesInfo;
|
import org.eclipse.cdt.debug.mi.core.output.MIVarShowAttributesInfo;
|
||||||
|
|
||||||
|
@ -65,15 +69,20 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
|
|
||||||
MIVar miVar;
|
MIVar miVar;
|
||||||
Value value;
|
Value value;
|
||||||
VariableObject varObj;
|
|
||||||
ICDIVariable[] children = new ICDIVariable[0];
|
ICDIVariable[] children = new ICDIVariable[0];
|
||||||
Type type;
|
Type type;
|
||||||
String editable = null;
|
String editable = null;
|
||||||
|
String language;
|
||||||
|
boolean isFake = false;
|
||||||
|
|
||||||
public Variable(VariableObject obj, MIVar v) {
|
public Variable(VariableObject obj, MIVar v) {
|
||||||
super(obj, obj.getName());
|
super(obj);
|
||||||
|
miVar = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Variable(ICDITarget target, String n, String q, ICDIStackFrame stack, int pos, int depth, MIVar v) {
|
||||||
|
super(target, n, q, stack, pos, depth);
|
||||||
miVar = v;
|
miVar = v;
|
||||||
varObj = obj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MIVar getMIVar() {
|
public MIVar getMIVar() {
|
||||||
|
@ -82,7 +91,7 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
|
|
||||||
public Variable getChild(String name) {
|
public Variable getChild(String name) {
|
||||||
for (int i = 0; i < children.length; i++) {
|
for (int i = 0; i < children.length; i++) {
|
||||||
Variable variable = (Variable)children[i];
|
Variable variable = (Variable) children[i];
|
||||||
if (name.equals(variable.getMIVar().getVarName())) {
|
if (name.equals(variable.getMIVar().getVarName())) {
|
||||||
return variable;
|
return variable;
|
||||||
} else {
|
} else {
|
||||||
|
@ -96,6 +105,38 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getLanguage() throws CDIException {
|
||||||
|
if (language == null) {
|
||||||
|
Session session = (Session) (getTarget().getSession());
|
||||||
|
MISession mi = session.getMISession();
|
||||||
|
CommandFactory factory = mi.getCommandFactory();
|
||||||
|
MIVarInfoExpression var = factory.createMIVarInfoExpression(getMIVar().getVarName());
|
||||||
|
try {
|
||||||
|
mi.postCommand(var);
|
||||||
|
MIVarInfoExpressionInfo info = var.getMIVarInfoExpressionInfo();
|
||||||
|
if (info == null) {
|
||||||
|
throw new CDIException("No answer");
|
||||||
|
}
|
||||||
|
language = info.getLanguage();
|
||||||
|
} catch (MIException e) {
|
||||||
|
throw new MI2CDIException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (language == null) ? "" : language;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isCPPLanguage() throws CDIException {
|
||||||
|
return getLanguage().equalsIgnoreCase("C++");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setIsFake(boolean f) {
|
||||||
|
isFake = f;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isFake() {
|
||||||
|
return isFake;
|
||||||
|
}
|
||||||
|
|
||||||
public ICDIVariable[] getChildren() throws CDIException {
|
public ICDIVariable[] getChildren() throws CDIException {
|
||||||
// Use the default timeout.
|
// Use the default timeout.
|
||||||
return getChildren(-1);
|
return getChildren(-1);
|
||||||
|
@ -106,11 +147,10 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
* allow the override of the timeout.
|
* allow the override of the timeout.
|
||||||
*/
|
*/
|
||||||
public ICDIVariable[] getChildren(int timeout) throws CDIException {
|
public ICDIVariable[] getChildren(int timeout) throws CDIException {
|
||||||
Session session = (Session)(getTarget().getSession());
|
Session session = (Session) (getTarget().getSession());
|
||||||
MISession mi = session.getMISession();
|
MISession mi = session.getMISession();
|
||||||
CommandFactory factory = mi.getCommandFactory();
|
CommandFactory factory = mi.getCommandFactory();
|
||||||
MIVarListChildren var =
|
MIVarListChildren var = factory.createMIVarListChildren(getMIVar().getVarName());
|
||||||
factory.createMIVarListChildren(getMIVar().getVarName());
|
|
||||||
try {
|
try {
|
||||||
if (timeout >= 0) {
|
if (timeout >= 0) {
|
||||||
mi.postCommand(var, timeout);
|
mi.postCommand(var, timeout);
|
||||||
|
@ -124,10 +164,53 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
MIVar[] vars = info.getMIVars();
|
MIVar[] vars = info.getMIVars();
|
||||||
children = new Variable[vars.length];
|
children = new Variable[vars.length];
|
||||||
for (int i = 0; i < vars.length; i++) {
|
for (int i = 0; i < vars.length; i++) {
|
||||||
VariableObject varObj = new VariableObject(getTarget(),
|
String qName = getQualifiedName();
|
||||||
vars[i].getExp(), getStackFrame(),
|
String childTypename = null;
|
||||||
getPosition(),getStackDepth());
|
boolean childFake = false;
|
||||||
children[i] = new Variable(varObj, vars[i]);
|
ICDIType t = getType();
|
||||||
|
if (t instanceof ICDIArrayType) {
|
||||||
|
qName = "(" + getQualifiedName() + ")[" + i + "]";
|
||||||
|
} else if (t instanceof ICDIPointerType) {
|
||||||
|
qName = "*(" + getQualifiedName() + ")";
|
||||||
|
} else if (t instanceof ICDIStructType) {
|
||||||
|
if (isCPPLanguage()) {
|
||||||
|
// For C++ in GDB the children of the
|
||||||
|
// the struture are the scope and the inherited classes.
|
||||||
|
// For example:
|
||||||
|
// class foo: public bar {
|
||||||
|
// int x;
|
||||||
|
// public: int y;
|
||||||
|
// } foobar;
|
||||||
|
// This will map to
|
||||||
|
// - foobar
|
||||||
|
// + bar
|
||||||
|
// - private
|
||||||
|
// - x
|
||||||
|
// - public
|
||||||
|
// - y
|
||||||
|
// So we choose to ignore the first set of children
|
||||||
|
// but carry over to those "fake" variable the typename and the qualified name
|
||||||
|
if (isFake()) {
|
||||||
|
qName = "(" + getQualifiedName() + ")." + vars[i].getExp();
|
||||||
|
} else {
|
||||||
|
// So if the child is something like "public", "private" ...
|
||||||
|
// carrry over the parent qualified name and the typename
|
||||||
|
// also flag it as a fake variable.
|
||||||
|
qName = getQualifiedName();
|
||||||
|
childTypename = typename;
|
||||||
|
childFake = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
qName = "(" + getQualifiedName() + ")." + vars[i].getExp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Variable v = new Variable(getTarget(), vars[i].getExp(), qName, getStackFrame(), getPosition(), getStackDepth(), vars[i]);
|
||||||
|
if (childTypename != null) {
|
||||||
|
// Hack to reset the typename to a known value
|
||||||
|
v.typename = childTypename;
|
||||||
|
}
|
||||||
|
v.setIsFake(childFake);
|
||||||
|
children[i] = v;
|
||||||
}
|
}
|
||||||
} catch (MIException e) {
|
} catch (MIException e) {
|
||||||
throw new MI2CDIException(e);
|
throw new MI2CDIException(e);
|
||||||
|
@ -147,7 +230,10 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
*/
|
*/
|
||||||
public String getTypeName() throws CDIException {
|
public String getTypeName() throws CDIException {
|
||||||
// We overload here not to use the whatis command.
|
// We overload here not to use the whatis command.
|
||||||
return miVar.getType();
|
if (typename == null) {
|
||||||
|
typename = miVar.getType();
|
||||||
|
}
|
||||||
|
return typename;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -185,7 +271,7 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
} else if (t instanceof ICDIArrayType) {
|
} else if (t instanceof ICDIArrayType) {
|
||||||
value = new ArrayValue(this);
|
value = new ArrayValue(this);
|
||||||
} else if (t instanceof ICDIStructType) {
|
} else if (t instanceof ICDIStructType) {
|
||||||
value = new StructValue(this);
|
value = new StructValue(this);
|
||||||
} else {
|
} else {
|
||||||
value = new Value(this);
|
value = new Value(this);
|
||||||
}
|
}
|
||||||
|
@ -204,7 +290,7 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIVariable#setValue(String)
|
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIVariable#setValue(String)
|
||||||
*/
|
*/
|
||||||
public void setValue(String expression) throws CDIException {
|
public void setValue(String expression) throws CDIException {
|
||||||
Session session = (Session)(getTarget().getSession());
|
Session session = (Session) (getTarget().getSession());
|
||||||
MISession mi = session.getMISession();
|
MISession mi = session.getMISession();
|
||||||
CommandFactory factory = mi.getCommandFactory();
|
CommandFactory factory = mi.getCommandFactory();
|
||||||
MIVarAssign var = factory.createMIVarAssign(miVar.getVarName(), expression);
|
MIVarAssign var = factory.createMIVarAssign(miVar.getVarName(), expression);
|
||||||
|
@ -226,20 +312,20 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
// Changing values may have side effects i.e. affecting other variables
|
// Changing values may have side effects i.e. affecting other variables
|
||||||
// if the manager is on autoupdate check all the other variables.
|
// if the manager is on autoupdate check all the other variables.
|
||||||
// Note: This maybe very costly.
|
// Note: This maybe very costly.
|
||||||
if (this instanceof Register) {
|
if (this instanceof Register) {
|
||||||
// If register was on autoupdate, update all the other registers
|
// If register was on autoupdate, update all the other registers
|
||||||
// assigning may have side effects i.e. affecting other registers.
|
// assigning may have side effects i.e. affecting other registers.
|
||||||
ICDIRegisterManager mgr = session.getRegisterManager();
|
ICDIRegisterManager mgr = session.getRegisterManager();
|
||||||
if (mgr.isAutoUpdate()) {
|
if (mgr.isAutoUpdate()) {
|
||||||
mgr.update();
|
mgr.update();
|
||||||
}
|
}
|
||||||
} else if (this instanceof Expression) {
|
} else if (this instanceof Expression) {
|
||||||
// If expression was on autoupdate, update all the other expression
|
// If expression was on autoupdate, update all the other expression
|
||||||
// assigning may have side effects i.e. affecting other expressions.
|
// assigning may have side effects i.e. affecting other expressions.
|
||||||
ICDIExpressionManager mgr = session.getExpressionManager();
|
ICDIExpressionManager mgr = session.getExpressionManager();
|
||||||
if (mgr.isAutoUpdate()) {
|
if (mgr.isAutoUpdate()) {
|
||||||
mgr.update();
|
mgr.update();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// FIXME: Should we always call the Variable Manager ?
|
// FIXME: Should we always call the Variable Manager ?
|
||||||
ICDIVariableManager mgr = session.getVariableManager();
|
ICDIVariableManager mgr = session.getVariableManager();
|
||||||
|
@ -256,7 +342,7 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
*/
|
*/
|
||||||
public boolean isEditable() throws CDIException {
|
public boolean isEditable() throws CDIException {
|
||||||
if (editable == null) {
|
if (editable == null) {
|
||||||
MISession mi = ((Session)(getTarget().getSession())).getMISession();
|
MISession mi = ((Session) (getTarget().getSession())).getMISession();
|
||||||
CommandFactory factory = mi.getCommandFactory();
|
CommandFactory factory = mi.getCommandFactory();
|
||||||
MIVarShowAttributes var = factory.createMIVarShowAttributes(miVar.getVarName());
|
MIVarShowAttributes var = factory.createMIVarShowAttributes(miVar.getVarName());
|
||||||
try {
|
try {
|
||||||
|
@ -278,7 +364,7 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
*/
|
*/
|
||||||
public void setFormat(int format) throws CDIException {
|
public void setFormat(int format) throws CDIException {
|
||||||
int fmt = Format.toMIFormat(format);
|
int fmt = Format.toMIFormat(format);
|
||||||
MISession mi = ((Session)(getTarget().getSession())).getMISession();
|
MISession mi = ((Session) (getTarget().getSession())).getMISession();
|
||||||
CommandFactory factory = mi.getCommandFactory();
|
CommandFactory factory = mi.getCommandFactory();
|
||||||
MIVarSetFormat var = factory.createMIVarSetFormat(miVar.getVarName(), fmt);
|
MIVarSetFormat var = factory.createMIVarSetFormat(miVar.getVarName(), fmt);
|
||||||
try {
|
try {
|
||||||
|
@ -297,7 +383,7 @@ public class Variable extends VariableObject implements ICDIVariable {
|
||||||
*/
|
*/
|
||||||
public boolean equals(ICDIVariable var) {
|
public boolean equals(ICDIVariable var) {
|
||||||
if (var instanceof Variable) {
|
if (var instanceof Variable) {
|
||||||
Variable variable = (Variable)var;
|
Variable variable = (Variable) var;
|
||||||
return miVar.getVarName().equals(variable.getMIVar().getVarName());
|
return miVar.getVarName().equals(variable.getMIVar().getVarName());
|
||||||
}
|
}
|
||||||
return super.equals(var);
|
return super.equals(var);
|
||||||
|
|
Loading…
Add table
Reference in a new issue