diff --git a/ILSpy/Metadata/DebugDirectoryTreeNode.cs b/ILSpy/Metadata/DebugDirectoryTreeNode.cs index efbb1fea4..fa765a454 100644 --- a/ILSpy/Metadata/DebugDirectoryTreeNode.cs +++ b/ILSpy/Metadata/DebugDirectoryTreeNode.cs @@ -18,6 +18,7 @@ #nullable enable +using System; using System.Collections.Generic; using System.Reflection.PortableExecutable; @@ -68,30 +69,37 @@ namespace ICSharpCode.ILSpy.Metadata { foreach (var entry in module.Reader.ReadDebugDirectory()) { - switch (entry.Type) + try { - case DebugDirectoryEntryType.CodeView: - var codeViewData = module.Reader.ReadCodeViewDebugDirectoryData(entry); - this.Children.Add(new CodeViewTreeNode(codeViewData)); - break; - - case DebugDirectoryEntryType.EmbeddedPortablePdb: - var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry); - var embeddedPortablePdbMetadataFile = new MetadataFile(MetadataFile.MetadataFileKind.ProgramDebugDatabase, module.FileName, embeddedPortablePdbProvider, isEmbedded: true); - this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)")); - break; - - case DebugDirectoryEntryType.PdbChecksum: - var pdbChecksumData = module.Reader.ReadPdbChecksumDebugDirectoryData(entry); - this.Children.Add(new PdbChecksumTreeNode(pdbChecksumData)); - break; - - case DebugDirectoryEntryType.Unknown: - case DebugDirectoryEntryType.Coff: - case DebugDirectoryEntryType.Reproducible: - default: - this.Children.Add(new DebugDirectoryEntryTreeNode(module, entry)); - break; + switch (entry.Type) + { + case DebugDirectoryEntryType.CodeView: + var codeViewData = module.Reader.ReadCodeViewDebugDirectoryData(entry); + this.Children.Add(new CodeViewTreeNode(codeViewData)); + break; + + case DebugDirectoryEntryType.EmbeddedPortablePdb: + var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry); + var embeddedPortablePdbMetadataFile = new MetadataFile(MetadataFile.MetadataFileKind.ProgramDebugDatabase, module.FileName, embeddedPortablePdbProvider, isEmbedded: true); + this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)")); + break; + + case DebugDirectoryEntryType.PdbChecksum: + var pdbChecksumData = module.Reader.ReadPdbChecksumDebugDirectoryData(entry); + this.Children.Add(new PdbChecksumTreeNode(pdbChecksumData)); + break; + + case DebugDirectoryEntryType.Unknown: + case DebugDirectoryEntryType.Coff: + case DebugDirectoryEntryType.Reproducible: + default: + this.Children.Add(new DebugDirectoryEntryTreeNode(module, entry)); + break; + } + } + catch (BadImageFormatException ex) + { + this.Children.Add(new ErrorTreeNode(ex)); } } } diff --git a/ILSpy/TreeNodes/ThreadingSupport.cs b/ILSpy/TreeNodes/ThreadingSupport.cs index 8aab2610f..fd0118de6 100644 --- a/ILSpy/TreeNodes/ThreadingSupport.cs +++ b/ILSpy/TreeNodes/ThreadingSupport.cs @@ -31,6 +31,8 @@ using ICSharpCode.Decompiler; using ICSharpCode.ILSpy.Properties; using ICSharpCode.ILSpyX.TreeView; +#nullable enable + namespace ICSharpCode.ILSpy.TreeNodes { /// @@ -40,7 +42,7 @@ namespace ICSharpCode.ILSpy.TreeNodes { readonly Stopwatch stopwatch = new Stopwatch(); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); - Task> loadChildrenTask; + Task>? loadChildrenTask; public bool IsRunning { get { return loadChildrenTask != null && !loadChildrenTask.IsCompleted; } @@ -67,7 +69,7 @@ namespace ICSharpCode.ILSpy.TreeNodes CancellationToken ct = cancellationTokenSource.Token; var fetchChildrenEnumerable = fetchChildren(ct); - Task> thisTask = null; + Task>? thisTask = null; thisTask = new Task>( delegate { List result = new List(); @@ -103,7 +105,7 @@ namespace ICSharpCode.ILSpy.TreeNodes { 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))] [Shared] 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()); + } + } + } }