Browse Source

Fix some more UI crashes.

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
8184cf6a5f
  1. 11
      ICSharpCode.Decompiler/Metadata/MetadataResolver.cs
  2. 6
      ILSpy/MainWindow.xaml.cs
  3. 42
      ILSpy/TreeNodes/BaseTypesEntryNode.cs

11
ICSharpCode.Decompiler/Metadata/MetadataResolver.cs

@ -197,12 +197,16 @@ namespace ICSharpCode.Decompiler.Metadata @@ -197,12 +197,16 @@ namespace ICSharpCode.Decompiler.Metadata
break;
case HandleKind.TypeReference:
var resolvedTypeReference = Resolve((TypeReferenceHandle)mr.Parent, context);
if (resolvedTypeReference.IsNil)
return default;
targetModule = resolvedTypeReference.Module;
targetMetadata = targetModule.Metadata;
declaringType = targetMetadata.GetTypeDefinition(resolvedTypeReference.Handle);
break;
case HandleKind.TypeSpecification:
resolvedTypeReference = Resolve((TypeSpecificationHandle)mr.Parent, context);
if (resolvedTypeReference.IsNil)
return default;
targetModule = resolvedTypeReference.Module;
targetMetadata = targetModule.Metadata;
declaringType = targetMetadata.GetTypeDefinition(resolvedTypeReference.Handle);
@ -221,7 +225,7 @@ namespace ICSharpCode.Decompiler.Metadata @@ -221,7 +225,7 @@ namespace ICSharpCode.Decompiler.Metadata
if (targetMetadata.StringComparer.Equals(fd.Name, name))
return new FieldDefinition(targetModule, f);
}
throw new NotSupportedException();
return default;
case MemberReferenceKind.Method:
var candidates = new List<(MethodDefinitionHandle, BlobHandle)>();
foreach (var m in declaringType.GetMethods()) {
@ -229,15 +233,14 @@ namespace ICSharpCode.Decompiler.Metadata @@ -229,15 +233,14 @@ namespace ICSharpCode.Decompiler.Metadata
if (targetMetadata.StringComparer.Equals(md.Name, name))
candidates.Add((m, md.Signature));
}
if (candidates.Count == 0)
throw new NotSupportedException();
foreach (var (method, signature) in candidates) {
if (SignatureBlobComparer.EqualsMethodSignature(targetMetadata.GetBlobReader(signature), metadata.GetBlobReader(mr.Signature), targetMetadata, metadata))
return new MethodDefinition(targetModule, method);
}
return default;
default:
throw new NotSupportedException();
}
throw new NotSupportedException();
}
public static TypeDefinition Resolve(this TypeSpecificationHandle handle, IMetadataResolveContext context)

6
ILSpy/MainWindow.xaml.cs

@ -616,7 +616,7 @@ namespace ICSharpCode.ILSpy @@ -616,7 +616,7 @@ namespace ICSharpCode.ILSpy
}
case TypeReference tr:
var resolved = tr.Handle.Resolve(new SimpleMetadataResolveContext(tr.Module));
if (!resolved.IsNil)
if (resolved != null && !resolved.IsNil)
return assemblyListTreeNode.FindTypeNode(resolved);
return null;
case TypeSpecification ts:
@ -626,7 +626,7 @@ namespace ICSharpCode.ILSpy @@ -626,7 +626,7 @@ namespace ICSharpCode.ILSpy
return null;
case MemberReference mr:
var resolvedMember = mr.Handle.Resolve(new SimpleMetadataResolveContext(mr.Module));
if (!resolvedMember.IsNil) {
if (resolvedMember != null && !resolvedMember.IsNil) {
switch (resolvedMember) {
case FieldDefinition fd:
return assemblyListTreeNode.FindFieldNode(fd);
@ -639,7 +639,7 @@ namespace ICSharpCode.ILSpy @@ -639,7 +639,7 @@ namespace ICSharpCode.ILSpy
return null;
case MethodSpecification ms:
resolvedMember = ms.Handle.Resolve(new SimpleMetadataResolveContext(ms.Module));
if (!resolvedMember.IsNil) {
if (resolvedMember != null && !resolvedMember.IsNil) {
switch (resolvedMember) {
case MethodDefinition md:
return assemblyListTreeNode.FindMethodNode(md);

42
ILSpy/TreeNodes/BaseTypesEntryNode.cs

@ -29,58 +29,48 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -29,58 +29,48 @@ namespace ICSharpCode.ILSpy.TreeNodes
readonly Entity tr;
readonly GenericContext context;
readonly bool isInterface;
TypeDefinition td;
readonly bool showExpander;
readonly object icon;
public BaseTypesEntryNode(GenericContext context, Entity entity, bool isInterface)
{
if (entity.IsNil) throw new ArgumentNullException(nameof(entity));
this.tr = entity;
this.td = tr.ResolveAsType();
this.context = context;
this.isInterface = isInterface;
this.LazyLoading = true;
}
public override bool ShowExpander
{
get {
if (td.IsNil) return false;
var td = tr.ResolveAsType();
if (!td.IsNil) {
var typeDef = td.Module.Metadata.GetTypeDefinition(td.Handle);
return !typeDef.BaseType.IsNil || typeDef.GetInterfaceImplementations().Any();
showExpander = !typeDef.BaseType.IsNil || typeDef.GetInterfaceImplementations().Any();
icon = TypeTreeNode.GetIcon(td);
} else {
showExpander = false;
icon = isInterface ? Images.Interface : Images.Class;
}
}
public override bool ShowExpander => showExpander;
public override object Text
{
get { return this.Language.TypeToString(tr, context, includeNamespace: true) + tr.Handle.ToSuffixString(); }
}
public override object Icon
{
get
{
if (!td.IsNil)
return TypeTreeNode.GetIcon(td);
else
return isInterface ? Images.Interface : Images.Class;
}
}
public override object Icon => icon;
protected override void LoadChildren()
{
if (!td.IsNil)
var td = tr.ResolveAsType();
if (!td.IsNil) {
BaseTypesTreeNode.AddBaseTypes(this.Children, td);
}
}
public override void ActivateItem(System.Windows.RoutedEventArgs e)
{
// on item activation, try to resolve once again (maybe the user loaded the assembly in the meantime)
if (td.IsNil) {
td = tr.ResolveAsType();
if (!td.IsNil)
this.LazyLoading = true;
// re-load children
}
var td = tr.ResolveAsType();
e.Handled = ActivateItem(this, td);
}

Loading…
Cancel
Save