Browse Source

Fix #580: Always flatten base types list.

pull/2069/head
Siegfried Pammer 5 years ago
parent
commit
6e68562bd9
  1. 18
      ILSpy/Properties/Resources.Designer.cs
  2. 3
      ILSpy/Properties/Resources.resx
  3. 61
      ILSpy/TreeNodes/BaseTypesEntryNode.cs
  4. 25
      ILSpy/TreeNodes/BaseTypesTreeNode.cs

18
ILSpy/Properties/Resources.Designer.cs generated

@ -405,6 +405,15 @@ namespace ICSharpCode.ILSpy.Properties { @@ -405,6 +405,15 @@ namespace ICSharpCode.ILSpy.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Base Types.
/// </summary>
public static string BaseTypes {
get {
return ResourceManager.GetString("BaseTypes", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to C_lone.
/// </summary>
@ -576,15 +585,6 @@ namespace ICSharpCode.ILSpy.Properties { @@ -576,15 +585,6 @@ namespace ICSharpCode.ILSpy.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Aggressively perform Scalar Replacement Of Aggregates (SROA).
/// </summary>
public static string DecompilerSettings_AggressiveScalarReplacementOfAggregates {
get {
return ResourceManager.GetString("DecompilerSettings.AggressiveScalarReplacementOfAggregates", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Allow extension &apos;Add&apos; methods in collection initializer expressions.
/// </summary>

3
ILSpy/Properties/Resources.resx

@ -873,4 +873,7 @@ Do you want to continue?</value> @@ -873,4 +873,7 @@ Do you want to continue?</value>
<data name="DecompilerSettings.UseSdkStyleProjectFormat" xml:space="preserve">
<value>Use new SDK style format for generated project files (*.csproj)</value>
</data>
<data name="BaseTypes" xml:space="preserve">
<value>Base Types</value>
</data>
</root>

61
ILSpy/TreeNodes/BaseTypesEntryNode.cs

@ -16,12 +16,8 @@ @@ -16,12 +16,8 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection.Metadata;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.TreeView;
@ -29,61 +25,20 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -29,61 +25,20 @@ namespace ICSharpCode.ILSpy.TreeNodes
{
sealed class BaseTypesEntryNode : ILSpyTreeNode, IMemberTreeNode
{
readonly PEFile module;
readonly EntityHandle handle;
readonly IType type;
readonly bool isInterface;
bool showExpander;
readonly ITypeDefinition type;
public BaseTypesEntryNode(PEFile module, EntityHandle handle, IType type, bool isInterface)
public BaseTypesEntryNode(ITypeDefinition type)
{
if (handle.IsNil)
throw new ArgumentNullException(nameof(handle));
this.module = module ?? throw new ArgumentNullException(nameof(module));
this.handle = handle;
this.type = type;
this.isInterface = isInterface;
this.LazyLoading = true;
TryResolve(module, handle, type);
}
ITypeDefinition TryResolve(PEFile module, EntityHandle handle, IType type, bool mayRetry = true)
{
DecompilerTypeSystem typeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver(),
TypeSystemOptions.Default | TypeSystemOptions.Uncached);
var t = typeSystem.MainModule.ResolveEntity(handle) as ITypeDefinition;
if (t != null) {
showExpander = t.DirectBaseTypes.Any();
var other = t.ParentModule.PEFile.GetTypeSystemWithCurrentOptionsOrNull();
Debug.Assert(other != null);
t = other.FindType(t.FullTypeName).GetDefinition();
} else {
showExpander = mayRetry;
}
RaisePropertyChanged(nameof(Text));
RaisePropertyChanged(nameof(ShowExpander));
return t;
}
public override object Text => this.Language.TypeToString(type, includeNamespace: true);
public override bool ShowExpander => showExpander && base.ShowExpander;
public override object Text => this.Language.TypeToString(type, includeNamespace: true) + handle.ToSuffixString();
public override object Icon =>
isInterface ? Images.Interface : Images.Class;
protected override void LoadChildren()
{
var t = TryResolve(module, handle, type, false);
if (t != null) {
BaseTypesTreeNode.AddBaseTypes(this.Children, t.ParentModule.PEFile, t);
}
}
public override object Icon => type.Kind == TypeKind.Interface ? Images.Interface : Images.Class;
public override void ActivateItem(System.Windows.RoutedEventArgs e)
{
var t = TryResolve(module, handle, type, false);
e.Handled = ActivateItem(this, t);
e.Handled = ActivateItem(this, type);
}
internal static bool ActivateItem(SharpTreeNode node, ITypeDefinition def)
@ -103,10 +58,6 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -103,10 +58,6 @@ namespace ICSharpCode.ILSpy.TreeNodes
language.WriteCommentLine(output, language.TypeToString(type, includeNamespace: true));
}
IEntity IMemberTreeNode.Member {
get {
return TryResolve(module, handle, type, false);
}
}
IEntity IMemberTreeNode.Member => type;
}
}

25
ILSpy/TreeNodes/BaseTypesTreeNode.cs

@ -20,6 +20,9 @@ using System; @@ -20,6 +20,9 @@ using System;
using System.Linq;
using System.Reflection.Metadata;
using System.Windows.Threading;
using Humanizer.Localisation;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
@ -42,7 +45,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -42,7 +45,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
this.LazyLoading = true;
}
public override object Text => "Base Types";
public override object Text => Properties.Resources.BaseTypes;
public override object Icon => Images.SuperTypes;
@ -53,19 +56,13 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -53,19 +56,13 @@ namespace ICSharpCode.ILSpy.TreeNodes
internal static void AddBaseTypes(SharpTreeNodeCollection children, PEFile module, ITypeDefinition typeDefinition)
{
var typeDef = module.Metadata.GetTypeDefinition((TypeDefinitionHandle)typeDefinition.MetadataToken);
var baseTypes = typeDefinition.DirectBaseTypes.ToArray();
int i = 0;
if (typeDefinition.Kind == TypeKind.Interface) {
i++;
} else if (!typeDef.BaseType.IsNil) {
children.Add(new BaseTypesEntryNode(module, typeDef.BaseType, baseTypes[i], false));
i++;
}
foreach (var h in typeDef.GetInterfaceImplementations()) {
var impl = module.Metadata.GetInterfaceImplementation(h);
children.Add(new BaseTypesEntryNode(module, impl.Interface, baseTypes[i], true));
i++;
TypeDefinitionHandle handle = (TypeDefinitionHandle)typeDefinition.MetadataToken;
DecompilerTypeSystem typeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver(),
TypeSystemOptions.Default | TypeSystemOptions.Uncached);
var t = typeSystem.MainModule.ResolveEntity(handle) as ITypeDefinition;
foreach (var td in t.GetAllBaseTypeDefinitions().Reverse().Skip(1)) {
if (t.Kind != TypeKind.Interface || t.Kind == td.Kind)
children.Add(new BaseTypesEntryNode(td));
}
}

Loading…
Cancel
Save