diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ChildNodesOfObject.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ChildNodesOfObject.cs index f4c60dcbd4..44c3d91976 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ChildNodesOfObject.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ChildNodesOfObject.cs @@ -21,9 +21,13 @@ namespace Debugger.AddIn.TreeModel if (shownType.BaseType != null) { yield return new BaseClassNode(expression, shownType.BaseType); } - yield return new PrivateMembersNode(expression, shownType); - yield return new StaticMembersNode(expression, shownType); - foreach(Expression childExpr in expression.AppendObjectMembers(shownType, BindingFlags.Public | BindingFlags.Instance)) { + if (shownType.HasMembers(BindingFlags.NonPublicInstance)) { + yield return new NonPublicInstanceMembersNode(expression, shownType); + } + if (shownType.HasMembers(BindingFlags.Static)) { + yield return new StaticMembersNode(expression, shownType); + } + foreach(Expression childExpr in expression.AppendObjectMembers(shownType, BindingFlags.PublicInstance)) { yield return new ExpressionNode(childExpr); } } @@ -46,12 +50,12 @@ namespace Debugger.AddIn.TreeModel } } - public class PrivateMembersNode: AbstractNode + public class NonPublicInstanceMembersNode: AbstractNode { Expression expression; DebugType shownType; - public PrivateMembersNode(Expression expression, DebugType shownType) + public NonPublicInstanceMembersNode(Expression expression, DebugType shownType) { this.expression = expression; this.shownType = shownType; @@ -62,7 +66,7 @@ namespace Debugger.AddIn.TreeModel IEnumerable GetChildNodes() { - foreach(Expression childExpr in expression.AppendObjectMembers(shownType, BindingFlags.NonPublic | BindingFlags.Instance)) { + foreach(Expression childExpr in expression.AppendObjectMembers(shownType, BindingFlags.NonPublicInstance)) { yield return new ExpressionNode(childExpr); } } @@ -84,19 +88,21 @@ namespace Debugger.AddIn.TreeModel IEnumerable GetChildNodes() { - yield return new PrivateStaticMembersNode(expression, shownType); - foreach(Expression childExpr in expression.AppendObjectMembers(shownType, BindingFlags.Public | BindingFlags.Static)) { + if (shownType.HasMembers(BindingFlags.NonPublicStatic)) { + yield return new NonPublicStaticMembersNode(expression, shownType); + } + foreach(Expression childExpr in expression.AppendObjectMembers(shownType, BindingFlags.PublicStatic)) { yield return new ExpressionNode(childExpr); } } } - public class PrivateStaticMembersNode: AbstractNode + public class NonPublicStaticMembersNode: AbstractNode { Expression expression; DebugType shownType; - public PrivateStaticMembersNode(Expression expression, DebugType shownType) + public NonPublicStaticMembersNode(Expression expression, DebugType shownType) { this.expression = expression; this.shownType = shownType; @@ -107,7 +113,7 @@ namespace Debugger.AddIn.TreeModel IEnumerable GetChildNodes() { - foreach(Expression childExpr in expression.AppendObjectMembers(shownType, BindingFlags.NonPublic | BindingFlags.Static)) { + foreach(Expression childExpr in expression.AppendObjectMembers(shownType, BindingFlags.NonPublicStatic)) { yield return new ExpressionNode(childExpr); } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/BindingFlags.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/BindingFlags.cs index ab46379ec6..d7aa988e79 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/BindingFlags.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/BindingFlags.cs @@ -27,6 +27,10 @@ namespace Debugger /// Return members which are not public NonPublic = 8, /// Return all members - All = Instance | Static | Public | NonPublic + All = Instance | Static | Public | NonPublic, + PublicInstance = Public | Instance, + PublicStatic = Public | Static, + NonPublicInstance = NonPublic | Instance, + NonPublicStatic = NonPublic | Static }; } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType-Helpers.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType-Helpers.cs index 7198ba14cc..d588f63d7f 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType-Helpers.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType-Helpers.cs @@ -29,15 +29,24 @@ namespace Debugger { List filtered = new List(); foreach(T memberInfo in input) { - if (memberInfo.IsStatic && ((bindingFlags & BindingFlags.Static) != 0) || - !memberInfo.IsStatic && ((bindingFlags & BindingFlags.Instance) != 0)) { - - if (memberInfo.IsPrivate && ((bindingFlags & BindingFlags.NonPublic) != 0) || - memberInfo.IsPublic && ((bindingFlags & BindingFlags.Public) != 0)) { - - filtered.Add(memberInfo); + // Filter by access + if ((bindingFlags & (BindingFlags.Public | BindingFlags.NonPublic)) != 0) { + if (memberInfo.IsPublic) { + // If we do not want public members + if ((bindingFlags & BindingFlags.Public) == 0) continue; // Reject item + } else { + if ((bindingFlags & BindingFlags.NonPublic) == 0) continue; // Reject item } } + // Filter by static / instance + if ((bindingFlags & (BindingFlags.Static | BindingFlags.Instance)) != 0) { + if (memberInfo.IsStatic) { + if ((bindingFlags & BindingFlags.Static) == 0) continue; // Reject item + } else { + if ((bindingFlags & BindingFlags.Instance) == 0) continue; // Reject item + } + } + filtered.Add(memberInfo); } return filtered.AsReadOnly(); } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs index dc61bcfa74..49c05c5401 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Types/DebugType.cs @@ -405,7 +405,7 @@ namespace Debugger /// Return all public fields. public IList GetFields() { - return GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + return GetFields(BindingFlags.Public); } /// Return all fields satisfing binding flags. @@ -417,7 +417,7 @@ namespace Debugger /// Return all public methods. public IList GetMethods() { - return GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + return GetMethods(BindingFlags.Public); } /// Return all methods satisfing binding flags. @@ -429,7 +429,7 @@ namespace Debugger /// Return all public properties. public IList GetProperties() { - return GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + return GetProperties(BindingFlags.Public); } /// Return all properties satisfing binding flags. @@ -447,7 +447,7 @@ namespace Debugger /// Return all public members. public IList GetMembers() { - return GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + return GetMembers(BindingFlags.Public); } /// Return all members satisfing binding flags. @@ -456,6 +456,12 @@ namespace Debugger return FilterMemberInfo(members, bindingFlags); } + /// Return whether the type has any members stisfing the given flags + public bool HasMembers(BindingFlags bindingFlags) + { + return (GetMembers(bindingFlags).Count > 0); + } + /// Compares two types public override bool Equals(object obj) {