Browse Source

Fix #3522: Improve error handling in DebugDirectoryTreeNode by reusing ErrorTreeNode.

pull/3551/head
Siegfried Pammer 4 months ago
parent
commit
4d38900dc0
  1. 54
      ILSpy/Metadata/DebugDirectoryTreeNode.cs
  2. 66
      ILSpy/TreeNodes/ThreadingSupport.cs

54
ILSpy/Metadata/DebugDirectoryTreeNode.cs

@ -18,6 +18,7 @@
#nullable enable #nullable enable
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection.PortableExecutable; using System.Reflection.PortableExecutable;
@ -68,30 +69,37 @@ namespace ICSharpCode.ILSpy.Metadata
{ {
foreach (var entry in module.Reader.ReadDebugDirectory()) foreach (var entry in module.Reader.ReadDebugDirectory())
{ {
switch (entry.Type) try
{ {
case DebugDirectoryEntryType.CodeView: switch (entry.Type)
var codeViewData = module.Reader.ReadCodeViewDebugDirectoryData(entry); {
this.Children.Add(new CodeViewTreeNode(codeViewData)); case DebugDirectoryEntryType.CodeView:
break; var codeViewData = module.Reader.ReadCodeViewDebugDirectoryData(entry);
this.Children.Add(new CodeViewTreeNode(codeViewData));
case DebugDirectoryEntryType.EmbeddedPortablePdb: break;
var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry);
var embeddedPortablePdbMetadataFile = new MetadataFile(MetadataFile.MetadataFileKind.ProgramDebugDatabase, module.FileName, embeddedPortablePdbProvider, isEmbedded: true); case DebugDirectoryEntryType.EmbeddedPortablePdb:
this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)")); var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry);
break; var embeddedPortablePdbMetadataFile = new MetadataFile(MetadataFile.MetadataFileKind.ProgramDebugDatabase, module.FileName, embeddedPortablePdbProvider, isEmbedded: true);
this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)"));
case DebugDirectoryEntryType.PdbChecksum: break;
var pdbChecksumData = module.Reader.ReadPdbChecksumDebugDirectoryData(entry);
this.Children.Add(new PdbChecksumTreeNode(pdbChecksumData)); case DebugDirectoryEntryType.PdbChecksum:
break; var pdbChecksumData = module.Reader.ReadPdbChecksumDebugDirectoryData(entry);
this.Children.Add(new PdbChecksumTreeNode(pdbChecksumData));
case DebugDirectoryEntryType.Unknown: break;
case DebugDirectoryEntryType.Coff:
case DebugDirectoryEntryType.Reproducible: case DebugDirectoryEntryType.Unknown:
default: case DebugDirectoryEntryType.Coff:
this.Children.Add(new DebugDirectoryEntryTreeNode(module, entry)); case DebugDirectoryEntryType.Reproducible:
break; default:
this.Children.Add(new DebugDirectoryEntryTreeNode(module, entry));
break;
}
}
catch (BadImageFormatException ex)
{
this.Children.Add(new ErrorTreeNode(ex));
} }
} }
} }

66
ILSpy/TreeNodes/ThreadingSupport.cs

@ -31,6 +31,8 @@ using ICSharpCode.Decompiler;
using ICSharpCode.ILSpy.Properties; using ICSharpCode.ILSpy.Properties;
using ICSharpCode.ILSpyX.TreeView; using ICSharpCode.ILSpyX.TreeView;
#nullable enable
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
/// <summary> /// <summary>
@ -40,7 +42,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
{ {
readonly Stopwatch stopwatch = new Stopwatch(); readonly Stopwatch stopwatch = new Stopwatch();
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
Task<List<SharpTreeNode>> loadChildrenTask; Task<List<SharpTreeNode>>? loadChildrenTask;
public bool IsRunning { public bool IsRunning {
get { return loadChildrenTask != null && !loadChildrenTask.IsCompleted; } get { return loadChildrenTask != null && !loadChildrenTask.IsCompleted; }
@ -67,7 +69,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
CancellationToken ct = cancellationTokenSource.Token; CancellationToken ct = cancellationTokenSource.Token;
var fetchChildrenEnumerable = fetchChildren(ct); var fetchChildrenEnumerable = fetchChildren(ct);
Task<List<SharpTreeNode>> thisTask = null; Task<List<SharpTreeNode>>? thisTask = null;
thisTask = new Task<List<SharpTreeNode>>( thisTask = new Task<List<SharpTreeNode>>(
delegate { delegate {
List<SharpTreeNode> result = new List<SharpTreeNode>(); List<SharpTreeNode> result = new List<SharpTreeNode>();
@ -103,7 +105,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
{ {
foreach (Exception ex in continuation.Exception.InnerExceptions) foreach (Exception ex in continuation.Exception.InnerExceptions)
{ {
node.Children.Add(new ErrorTreeNode(ex.ToString())); node.Children.Add(new ErrorTreeNode(ex));
} }
} }
} }
@ -148,29 +150,6 @@ namespace ICSharpCode.ILSpy.TreeNodes
} }
} }
sealed class ErrorTreeNode : ILSpyTreeNode
{
readonly string text;
public override object Text {
get { return text; }
}
public ErrorTreeNode(string text)
{
this.text = text;
}
public override FilterResult Filter(LanguageSettings settings)
{
return FilterResult.Match;
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
}
}
[ExportContextMenuEntry(Header = nameof(Resources.CopyErrorMessage))] [ExportContextMenuEntry(Header = nameof(Resources.CopyErrorMessage))]
[Shared] [Shared]
sealed class CopyErrorMessageContextMenu : IContextMenuEntry sealed class CopyErrorMessageContextMenu : IContextMenuEntry
@ -201,4 +180,39 @@ namespace ICSharpCode.ILSpy.TreeNodes
} }
} }
} }
sealed class ErrorTreeNode : ILSpyTreeNode
{
public Exception? Exception { get; }
public override object Text { get; }
public override object Icon => Images.Load(this, "Images/Warning");
public ErrorTreeNode(Exception exception)
: this(exception.Message)
{
this.Exception = exception;
}
public ErrorTreeNode(string text)
{
this.Text = text;
}
public override FilterResult Filter(LanguageSettings settings)
{
return FilterResult.Match;
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
output.WriteLine(this.Text.ToString());
output.WriteLine();
if (this.Exception != null)
{
output.WriteLine(this.Exception.ToString());
}
}
}
} }

Loading…
Cancel
Save