diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/BaseClassItem.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/BaseClassItem.cs index 8567093e10..46766be377 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/BaseClassItem.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/BaseClassItem.cs @@ -12,21 +12,16 @@ using DebuggerLibrary; namespace ICSharpCode.SharpDevelop.Gui.Pads { - class BaseClassItem: VariableListItem + class BaseClassItem: VariableItem { - ObjectVariable variable; - - public override bool IsValid { - get { - return variable != null && - variable.HasBaseClass && - variable.BaseClass.Type != "System.Object"; - } - } - - public BaseClassItem(Variable baseClassOfVariable): base() + public BaseClassItem(Variable uncastedVariable) { - this.variable = baseClassOfVariable as ObjectVariable; + ObjectVariable variable = uncastedVariable as ObjectVariable; + if (variable != null && variable.HasBaseClass && variable.BaseClass.Type != "System.Object") { + this.Variable = variable.BaseClass; + } else { + this.Variable = null; + } Refresh(); } @@ -35,15 +30,19 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads if (!IsValid) { return; } - + SetTexts("", - variable.BaseClass.Value.ToString(), - variable.BaseClass.Type); - + Variable.Value.ToString(), + Variable.Type); + ImageIndex = 0; // Class - - if (variable.BaseClass.MayHaveSubVariables) { // Always true - Items.Add(new PlaceHolderItem()); // Show plus icon + + if (IsExpanded) { + UpdateSubVariables(); + } else { + if (Variable.MayHaveSubVariables) { // Always true + Items.Add(new PlaceHolderItem()); // Show plus icon + } } } } diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/LocalVarPad.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/LocalVarPad.cs index efb23dcb16..c4beb546cb 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/LocalVarPad.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/LocalVarPad.cs @@ -156,7 +156,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads } VariableItem variableItem = item as VariableItem; - if (variableItem != null && !variables.Contains(variableItem.Variable.Name)) { + if (variableItem != null && !(item is BaseClassItem) && !variables.Contains(variableItem.Variable.Name)) { toBeRemoved.Add(item); } } diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/VariableItem.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/VariableItem.cs index 96a1e27612..eb3f8118ef 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/VariableItem.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/VariableItem.cs @@ -33,7 +33,12 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads !variable.Name.StartsWith("CS$"); } } - + + protected VariableItem() + { + + } + public VariableItem(Variable variable): base() { this.variable = variable; @@ -62,17 +67,17 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads } else { ImageIndex = 1; // Field } - - if (variable.MayHaveSubVariables && !IsExpanded) { - Items.Add(new PlaceHolderItem()); // Show plus icon - } - + if (IsExpanded) { UpdateSubVariables(); + } else { + if (variable.MayHaveSubVariables) { + Items.Add(new PlaceHolderItem()); // Show plus icon + } } } - void UpdateSubVariables() { + protected void UpdateSubVariables() { if (!baseClassItemAdded) { VariableListItem baseClassItem = new BaseClassItem(variable); if (baseClassItem.IsValid) { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectVariable.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectVariable.cs index 76fc7131df..aa1962a9b0 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectVariable.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ObjectVariable.cs @@ -101,7 +101,13 @@ namespace DebuggerLibrary public bool HasBaseClass { get { - if (baseClass == null) baseClass = GetBaseClass(); + if (baseClass == null) { + try { + baseClass = GetBaseClass(); + } catch (DebuggerException) { + baseClass = null; + } + } return (baseClass != null); } } @@ -129,12 +135,11 @@ namespace DebuggerLibrary corModuleSuperclass = m.CorModule; break; } - if (classProps.SuperClassToken == 0) throw new DebuggerException("Unable to get base class: " + fullTypeName); } // If it has no base class if ((classProps.SuperClassToken & 0x00FFFFFF) == 0) { - return null; + throw new DebuggerException("Unable to get base class: " + fullTypeName); } else { ICorDebugClass superClass; corModuleSuperclass.GetClassFromToken(classProps.SuperClassToken, out superClass);