Browse Source

Include inherited constructors and nested types

pull/3082/head
miloush 3 years ago
parent
commit
bf76abf93f
  1. 29
      ILSpy/TreeNodes/TypeTreeNode.cs

29
ILSpy/TreeNodes/TypeTreeNode.cs

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Media;
@ -101,13 +102,17 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -101,13 +102,17 @@ namespace ICSharpCode.ILSpy.TreeNodes
protected override void LoadChildren()
{
loadedInheritedMembers = FilterSettings.ShowApiInherited;
GetMemberOptions inheritanceOptions = FilterSettings.ShowApiInherited ? GetMemberOptions.None : GetMemberOptions.IgnoreInheritedMembers;
if (TypeDefinition.DirectBaseTypes.Any())
this.Children.Add(new BaseTypesTreeNode(ParentAssemblyNode.LoadedAssembly.GetPEFileOrNull(), TypeDefinition));
if (!TypeDefinition.IsSealed)
this.Children.Add(new DerivedTypesTreeNode(ParentAssemblyNode.AssemblyList, TypeDefinition));
foreach (var nestedType in TypeDefinition.NestedTypes.OrderBy(t => t.Name, NaturalStringComparer.Instance))
loadedInheritedMembers = FilterSettings.ShowApiInherited;
IEnumerable<ITypeDefinition> nestedTypes = GetMembers(TypeDefinition, t => t.NestedTypes, FilterSettings.ShowApiInherited);
IEnumerable<IField> fields = GetMembers(TypeDefinition, t => t.Fields, FilterSettings.ShowApiInherited);
IEnumerable<IProperty> properties = GetMembers(TypeDefinition, t => t.Properties, FilterSettings.ShowApiInherited);
IEnumerable<IEvent> events = GetMembers(TypeDefinition, t => t.Events, FilterSettings.ShowApiInherited);
IEnumerable<IMethod> methods = GetMembers(TypeDefinition, t => t.Methods, FilterSettings.ShowApiInherited);
foreach (var nestedType in nestedTypes.OrderBy(t => t.Name, NaturalStringComparer.Instance))
{
this.Children.Add(new TypeTreeNode(nestedType, ParentAssemblyNode));
}
@ -121,20 +126,20 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -121,20 +126,20 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
else
{
foreach (var field in TypeDefinition.GetFields(null, inheritanceOptions).OrderBy(f => f.Name, NaturalStringComparer.Instance))
foreach (var field in fields.OrderBy(f => f.Name, NaturalStringComparer.Instance))
{
this.Children.Add(new FieldTreeNode(field));
}
}
foreach (var property in TypeDefinition.GetProperties(null, inheritanceOptions).OrderBy(p => p.Name, NaturalStringComparer.Instance))
foreach (var property in properties.OrderBy(p => p.Name, NaturalStringComparer.Instance))
{
this.Children.Add(new PropertyTreeNode(property));
}
foreach (var ev in TypeDefinition.GetEvents(null, inheritanceOptions).OrderBy(e => e.Name, NaturalStringComparer.Instance))
foreach (var ev in events.OrderBy(e => e.Name, NaturalStringComparer.Instance))
{
this.Children.Add(new EventTreeNode(ev));
}
foreach (var method in TypeDefinition.GetMethods(null, inheritanceOptions).OrderBy(m => m.Name, NaturalStringComparer.Instance))
foreach (var method in methods.OrderBy(m => m.Name, NaturalStringComparer.Instance))
{
if (method.MetadataToken.IsNil)
continue;
@ -142,6 +147,16 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -142,6 +147,16 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
}
private IEnumerable<TMember> GetMembers<TMember>(ITypeDefinition type, Func<ITypeDefinition, IEnumerable<TMember>> selector, bool includeInherited)
{
IEnumerable<TMember> allMembers = selector(type);
if (includeInherited)
foreach (var baseType in type.GetNonInterfaceBaseTypes().Reverse().Select(t => t.GetDefinition()))
if (baseType != null && baseType != type)
allMembers = allMembers.Concat(selector(baseType));
return allMembers;
}
public override bool CanExpandRecursively => true;
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)

Loading…
Cancel
Save