package melnorme.lang.ide.debug.core.services; import org.eclipse.cdt.dsf.gdb.GDBTypeParser; import org.eclipse.cdt.dsf.gdb.GDBTypeParser.GDBDerivedType; import org.eclipse.cdt.dsf.gdb.GDBTypeParser.GDBType; import org.eclipse.cdt.dsf.mi.service.MIVariableManager; import org.eclipse.cdt.dsf.mi.service.command.output.MIVar; import org.eclipse.cdt.dsf.service.DsfServicesTracker; import org.eclipse.cdt.dsf.service.DsfSession; public class MIVariableManager_LangExtension extends MIVariableManager { public MIVariableManager_LangExtension(DsfSession session, DsfServicesTracker tracker) { super(session, tracker); } @Override protected MIRootVariableObject createRootVariableObject(VariableObjectId id) { return new MIRootVariableObject_Extension(id); } @Override protected MIVariableObject createVariableObject(VariableObjectId id, MIVariableObject parentObj) { return new MIVariableObject_Extension(id, parentObj); } protected class MIRootVariableObject_Extension extends MIRootVariableObject { protected GDBType corrected_gdbType; private MIRootVariableObject_Extension(VariableObjectId id) { super(id); } @Override public void setType(String newTypeName) { super.setType(newTypeName); corrected_gdbType = getCorrectedGdbType(newTypeName, super.getGDBType()); } @Override public GDBType getGDBType() { return corrected_gdbType; } @Override protected MIVariableObject createChild(VariableObjectId childId, String childFullExpression, int indexInParent, MIVar childData) { childFullExpression = createChild_getChildFullExpression(childFullExpression, childData); return super.createChild(childId, childFullExpression, indexInParent, childData); } } protected class MIVariableObject_Extension extends MIVariableObject { protected GDBType corrected_gdbType; public MIVariableObject_Extension(VariableObjectId id, MIVariableObject parentObj) { super(id, parentObj); } @Override public void setType(String newTypeName) { super.setType(newTypeName); corrected_gdbType = getCorrectedGdbType(newTypeName, super.getGDBType()); } @Override public GDBType getGDBType() { return corrected_gdbType; } @Override protected MIVariableObject createChild(VariableObjectId childId, String childFullExpression, int indexInParent, MIVar childData) { childFullExpression = createChild_getChildFullExpression(childFullExpression, childData); return super.createChild(childId, childFullExpression, indexInParent, childData); } } protected final GDBTypeParser gdbTypeParser = new GDBTypeParser(); @SuppressWarnings("unused") protected GDBType getCorrectedGdbType(String newTypeName, GDBType gdbType) { if(gdbType.getType() == GDBType.ARRAY && gdbType instanceof GDBDerivedType) { GDBDerivedType gdbDerivedType = (GDBDerivedType) gdbType; if(gdbDerivedType.getDimension() == 0) { // Correct a limitation in the GDBTypeParser when a "[]" type decl is present // CDT will think it's a pointer-like C-style array, and will try to display a custom node structure. // But in other languages, it's more likely to be a struct, so report as generic type. gdbType = gdbTypeParser.new GDBDerivedType(gdbDerivedType.getChild(), GDBType.GENERIC); } } return gdbType; } @SuppressWarnings("unused") public String createChild_getChildFullExpression(String childFullExpression, MIVar childData) { return childFullExpression; } }