Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java130
1 files changed, 54 insertions, 76 deletions
diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java
index 9504222a809..79719b13842 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java
@@ -21,7 +21,6 @@ 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.ICDIBoolType;
import org.eclipse.cdt.debug.core.cdi.model.type.ICDICharType;
-import org.eclipse.cdt.debug.core.cdi.model.type.ICDIDerivedType;
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIDoubleType;
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIEnumType;
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIFloatType;
@@ -228,7 +227,6 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl
* allow the override of the timeout.
*/
public ICDIVariable[] getChildren(int timeout) throws CDIException {
- children = NO_CHILDREN;
MISession mi = ((Target)getTarget()).getMISession();
CommandFactory factory = mi.getCommandFactory();
MIVarListChildren var = factory.createMIVarListChildren(getMIVar().getVarName());
@@ -244,105 +242,85 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl
}
MIVar[] vars = info.getMIVars();
List childrenList = new ArrayList(vars.length);
-// children = new Variable[vars.length];
- // For C++ in GDB the children of the
- // the structure 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" variables the typename and the qualified name
- boolean cppFakeLayer = isCPPLanguage() && (!isFake() || (isFake() && !isAccessQualifier(fName)));
- ICDIType t = getType();
- boolean container = isStructureProvider(t);
for (int i = 0; i < vars.length; i++) {
- // parent qualified name
- String prefix = '(' + getFullName() + ')';
- // child simple name
- String childName = vars[i].getExp();
- // fallback full name
- String childFullName = prefix + '.' + childName;
+ String fn = getQualifiedName();
+ String childName = vars[i].getExp();
ICDIType childType = null;
boolean childFake = false;
- if (cppFakeLayer && container) {
- childFake = true;
- childType = t;
- if (!isAccessQualifier(childName)) {
- // if field is not access modifier and fake - it is a basetype
- // cast to it to see reduced structure as value
- childFullName = '(' + childName + ')' + prefix;
+ ICDIType t = getType();
+ if (t instanceof ICDIArrayType) {
+ // For Array gdb varobj only return the index, override here.
+ int index = castingIndex + i;
+ fn = "(" + fn + ")[" + index + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ childName = getName() + "[" + index + "]"; //$NON-NLS-1$ //$NON-NLS-2$
+ } else if (t instanceof ICDIPointerType) {
+ ICDIType subType = ((ICDIPointerType)t).getComponentType();
+ if (subType instanceof ICDIStructType || t instanceof IncompleteType) {
+ if (isCPPLanguage()) {
+ if (!isFake() || (isFake() && !isAccessQualifier(fName))) {
+ childFake = true;
+ childType = t;
+ } else {
+ fn = "(" + fn + ")->" + vars[i].getExp(); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else { // If not C++ language
+ fn = "(" + fn + ")->" + vars[i].getExp(); //$NON-NLS-1$ //$NON-NLS-2$
+ }
} else {
- childFullName = prefix;
+ fn = "*(" + fn + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
- } else {
- if (t instanceof ICDIArrayType) {
- // For Array gdb varobj only return the index, override here.
- int index = castingIndex + i;
- childFullName = prefix + "[" + index + "]"; //$NON-NLS-1$ //$NON-NLS-2$
- childName = getName() + "[" + index + "]"; //$NON-NLS-1$ //$NON-NLS-2$
- } else if (t instanceof ICDIPointerType) {
- if (container) {
- childFullName = prefix + "->" + childName; //$NON-NLS-1$
- } else {
- childFullName = "*" + prefix; //$NON-NLS-1$
+ } else if (t instanceof ICDIReferenceType) {
+ ICDIType subType = ((ICDIReferenceType)t).getComponentType();
+ if (subType instanceof ICDIStructType || t instanceof IncompleteType) {
+ if (isCPPLanguage()) {
+ if (!isFake() || (isFake() && !isAccessQualifier(fName))) {
+ childFake = true;
+ childType = t;
+ } else {
+ fn = "(" + fn + ")." + vars[i].getExp(); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else { // If not C++ language
+ fn = "(" + fn + ")." + vars[i].getExp(); //$NON-NLS-1$ //$NON-NLS-2$
}
- } else if (t instanceof ICDIReferenceType) {
- if (container) {
- childFullName = prefix + "." + childName; //$NON-NLS-1$
+ } else {
+ fn = "(" + fn + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else if (t instanceof ICDIStructType || t instanceof IncompleteType) {
+ if (isCPPLanguage()) {
+ if (!isFake() || (isFake() && !isAccessQualifier(fName))) {
+ childFake = true;
+ childType = t;
} else {
- childFullName = prefix;
+ fn = "(" + fn + ")." + vars[i].getExp(); //$NON-NLS-1$ //$NON-NLS-2$
}
- } else if (t instanceof ICDIStructType) {
- // already correct name
+ } else { // If not C++ language
+ fn = "(" + fn + ")." + vars[i].getExp(); //$NON-NLS-1$ //$NON-NLS-2$
}
}
- Variable v = createVariable((Target) getTarget(), (Thread) getThread(), (StackFrame) getStackFrame(), childName,
- childFullName, getPosition(), getStackDepth(), vars[i]);
+ Variable v = createVariable((Target)getTarget(), (Thread)getThread(), (StackFrame)getStackFrame(),
+ childName, fn, getPosition(), getStackDepth(), vars[i]);
if (childType != null) {
// Hack to reset the typename to a known value
v.fType = childType;
}
v.setIsFake(childFake);
if (childFake && isAccessQualifier(childName)) {
- // Replace a fake variable representing an access qualifier with its children.
- ICDIVariable[] grandchildren = v.getChildren(timeout);
- for (int j = 0; j < grandchildren.length; j++) {
+ // don't add these, add their kids
+ ICDIVariable[] grandchildren = v.getChildren();
+ for (int j = 0; j < grandchildren.length; ++j)
childrenList.add(grandchildren[j]);
- }
- } else {
+ } else
childrenList.add(v);
- }
}
- if (!childrenList.isEmpty())
- children = (ICDIVariable[]) childrenList.toArray(new Variable[childrenList.size()]);
+
+ children = (ICDIVariable[])childrenList.toArray(new ICDIVariable[childrenList.size()]);
} catch (MIException e) {
throw new MI2CDIException(e);
}
return children;
}
- private boolean isStructureProvider(ICDIType t) {
- // IncompleteType can be only struct or class, so same rules apply
- if (t instanceof ICDIStructType || t instanceof IncompleteType)
- return true;
- if (t instanceof ICDIPointerType || t instanceof ICDIReferenceType) {
- ICDIType type = ((ICDIDerivedType)t).getComponentType();
- return (type instanceof ICDIStructType || type instanceof IncompleteType);
- }
- return false;
-
- }
-
- boolean isAccessQualifier(String foo) {
+ boolean isAccessQualifier(String foo) {
return foo.equals("private") || foo.equals("public") || foo.equals("protected"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}

Back to the top