Browse Source

Remove unnecessary ModuleReferences property from PEFile

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
da1d173873
  1. 1
      ICSharpCode.Decompiler/Metadata/PEFile.cs
  2. 8
      ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs
  3. 88
      ILSpy/TreeNodes/AssemblyTreeNode.cs
  4. 2
      ILSpy/TreeNodes/ReferenceFolderTreeNode.cs

1
ICSharpCode.Decompiler/Metadata/PEFile.cs

@ -85,7 +85,6 @@ namespace ICSharpCode.Decompiler.Metadata
} }
public ImmutableArray<AssemblyReference> AssemblyReferences => Metadata.AssemblyReferences.Select(r => new AssemblyReference(this, r)).ToImmutableArray(); public ImmutableArray<AssemblyReference> AssemblyReferences => Metadata.AssemblyReferences.Select(r => new AssemblyReference(this, r)).ToImmutableArray();
public ImmutableArray<ModuleReferenceHandle> ModuleReferences => Metadata.GetModuleReferences().ToImmutableArray();
public ImmutableArray<TypeDefinition> TopLevelTypeDefinitions => Metadata.GetTopLevelTypeDefinitions().Select(t => new TypeDefinition(this, t)).ToImmutableArray(); public ImmutableArray<TypeDefinition> TopLevelTypeDefinitions => Metadata.GetTopLevelTypeDefinitions().Select(t => new TypeDefinition(this, t)).ToImmutableArray();
public ImmutableArray<Resource> Resources => GetResources().ToImmutableArray(); public ImmutableArray<Resource> Resources => GetResources().ToImmutableArray();

8
ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs

@ -32,12 +32,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
public AssemblyReferenceTreeNode(AssemblyReference r, AssemblyTreeNode parentAssembly) public AssemblyReferenceTreeNode(AssemblyReference r, AssemblyTreeNode parentAssembly)
{ {
if (parentAssembly == null) this.r = r ?? throw new ArgumentNullException(nameof(r));
throw new ArgumentNullException(nameof(parentAssembly)); this.parentAssembly = parentAssembly ?? throw new ArgumentNullException(nameof(parentAssembly));
if (r.IsNil)
throw new ArgumentNullException(nameof(r));
this.r = r;
this.parentAssembly = parentAssembly;
this.LazyLoading = true; this.LazyLoading = true;
} }

88
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -20,7 +20,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection.PortableExecutable;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
@ -30,9 +29,8 @@ using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.TextView; using ICSharpCode.ILSpy.TextView;
using ICSharpCode.TreeView; using ICSharpCode.TreeView;
using Microsoft.Win32; using Microsoft.Win32;
using ICSharpCode.Decompiler.TypeSystem;
using SRM = System.Reflection.Metadata; using ICSharpCode.Decompiler.TypeSystem.Implementation;
using static System.Reflection.Metadata.PEReaderExtensions;
namespace ICSharpCode.ILSpy.TreeNodes namespace ICSharpCode.ILSpy.TreeNodes
{ {
@ -42,46 +40,36 @@ namespace ICSharpCode.ILSpy.TreeNodes
/// </summary> /// </summary>
public sealed class AssemblyTreeNode : ILSpyTreeNode public sealed class AssemblyTreeNode : ILSpyTreeNode
{ {
readonly LoadedAssembly assembly;
readonly Dictionary<string, NamespaceTreeNode> namespaces = new Dictionary<string, NamespaceTreeNode>(); readonly Dictionary<string, NamespaceTreeNode> namespaces = new Dictionary<string, NamespaceTreeNode>();
readonly Dictionary<TypeDefinition, TypeTreeNode> typeDict = new Dictionary<TypeDefinition, TypeTreeNode>();
ICompilation typeSystem;
public AssemblyTreeNode(LoadedAssembly assembly) public AssemblyTreeNode(LoadedAssembly assembly)
{ {
if (assembly == null) this.LoadedAssembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
throw new ArgumentNullException(nameof(assembly));
this.assembly = assembly;
assembly.ContinueWhenLoaded(OnAssemblyLoaded, TaskScheduler.FromCurrentSynchronizationContext()); assembly.ContinueWhenLoaded(OnAssemblyLoaded, TaskScheduler.FromCurrentSynchronizationContext());
this.LazyLoading = true; this.LazyLoading = true;
} }
public AssemblyList AssemblyList public AssemblyList AssemblyList {
{ get { return LoadedAssembly.AssemblyList; }
get { return assembly.AssemblyList; }
} }
public LoadedAssembly LoadedAssembly public LoadedAssembly LoadedAssembly { get; }
{
get { return assembly; }
}
public override bool IsAutoLoaded public override bool IsAutoLoaded {
{ get {
get { return LoadedAssembly.IsAutoLoaded;
return assembly.IsAutoLoaded;
} }
} }
public override object Text => assembly.Text; public override object Text => LoadedAssembly.Text;
public override object Icon public override object Icon {
{ get {
get if (LoadedAssembly.IsLoaded) {
{ return LoadedAssembly.HasLoadError ? Images.AssemblyWarning : Images.Assembly;
if (assembly.IsLoaded) {
return assembly.HasLoadError ? Images.AssemblyWarning : Images.Assembly;
} else { } else {
return Images.AssemblyLoading; return Images.AssemblyLoading;
} }
@ -90,15 +78,14 @@ namespace ICSharpCode.ILSpy.TreeNodes
TextBlock tooltip; TextBlock tooltip;
public override object ToolTip public override object ToolTip {
{
get { get {
if (assembly.HasLoadError) if (LoadedAssembly.HasLoadError)
return "Assembly could not be loaded. Click here for details."; return "Assembly could not be loaded. Click here for details.";
if (tooltip == null && assembly.IsLoaded) { if (tooltip == null && LoadedAssembly.IsLoaded) {
tooltip = new TextBlock(); tooltip = new TextBlock();
var module = assembly.GetPEFileOrNull(); var module = LoadedAssembly.GetPEFileOrNull();
var metadata = module?.Metadata; var metadata = module?.Metadata;
if (metadata?.IsAssembly == true) { if (metadata?.IsAssembly == true) {
tooltip.Inlines.Add(new Bold(new Run("Name: "))); tooltip.Inlines.Add(new Bold(new Run("Name: ")));
@ -106,7 +93,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
tooltip.Inlines.Add(new LineBreak()); tooltip.Inlines.Add(new LineBreak());
} }
tooltip.Inlines.Add(new Bold(new Run("Location: "))); tooltip.Inlines.Add(new Bold(new Run("Location: ")));
tooltip.Inlines.Add(new Run(assembly.FileName)); tooltip.Inlines.Add(new Run(LoadedAssembly.FileName));
tooltip.Inlines.Add(new LineBreak()); tooltip.Inlines.Add(new LineBreak());
tooltip.Inlines.Add(new Bold(new Run("Architecture: "))); tooltip.Inlines.Add(new Bold(new Run("Architecture: ")));
tooltip.Inlines.Add(new Run(Language.GetPlatformDisplayName(module))); tooltip.Inlines.Add(new Run(Language.GetPlatformDisplayName(module)));
@ -122,9 +109,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
} }
} }
public override bool ShowExpander public override bool ShowExpander {
{ get { return !LoadedAssembly.HasLoadError; }
get { return !assembly.HasLoadError; }
} }
void OnAssemblyLoaded(Task<PEFile> moduleTask) void OnAssemblyLoaded(Task<PEFile> moduleTask)
@ -135,23 +121,21 @@ namespace ICSharpCode.ILSpy.TreeNodes
RaisePropertyChanged("Tooltip"); RaisePropertyChanged("Tooltip");
if (moduleTask.IsFaulted) { if (moduleTask.IsFaulted) {
RaisePropertyChanged("ShowExpander"); // cannot expand assemblies with load error RaisePropertyChanged("ShowExpander"); // cannot expand assemblies with load error
// observe the exception so that the Task's finalizer doesn't re-throw it // observe the exception so that the Task's finalizer doesn't re-throw it
try { moduleTask.Wait(); } try { moduleTask.Wait(); } catch (AggregateException) { }
catch (AggregateException) { }
} else { } else {
RaisePropertyChanged("Text"); // shortname might have changed RaisePropertyChanged("Text"); // shortname might have changed
} }
} }
readonly Dictionary<TypeDefinition, TypeTreeNode> typeDict = new Dictionary<TypeDefinition, TypeTreeNode>();
protected override void LoadChildren() protected override void LoadChildren()
{ {
var module = assembly.GetPEFileOrNull(); var module = LoadedAssembly.GetPEFileOrNull();
if (module == null) { if (module == null) {
// if we crashed on loading, then we don't have any children // if we crashed on loading, then we don't have any children
return; return;
} }
typeSystem = new SimpleCompilation(module, MinimalCorlib.Instance);
var metadata = module.Metadata; var metadata = module.Metadata;
this.Children.Add(new ReferenceFolderTreeNode(module, this)); this.Children.Add(new ReferenceFolderTreeNode(module, this));
@ -209,7 +193,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
else else
return null; return null;
} }
public override bool CanDrag(SharpTreeNode[] nodes) public override bool CanDrag(SharpTreeNode[] nodes)
{ {
return nodes.All(n => n is AssemblyTreeNode); return nodes.All(n => n is AssemblyTreeNode);
@ -232,7 +216,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override void DeleteCore() public override void DeleteCore()
{ {
assembly.AssemblyList.Unload(assembly); LoadedAssembly.AssemblyList.Unload(LoadedAssembly);
} }
internal const string DataFormat = "ILSpyAssemblies"; internal const string DataFormat = "ILSpyAssemblies";
@ -246,7 +230,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
public override FilterResult Filter(FilterSettings settings) public override FilterResult Filter(FilterSettings settings)
{ {
if (settings.SearchTermMatches(assembly.ShortName)) if (settings.SearchTermMatches(LoadedAssembly.ShortName))
return FilterResult.Match; return FilterResult.Match;
else else
return FilterResult.Recurse; return FilterResult.Recurse;
@ -265,9 +249,9 @@ namespace ICSharpCode.ILSpy.TreeNodes
} }
try { try {
assembly.WaitUntilLoaded(); // necessary so that load errors are passed on to the caller LoadedAssembly.WaitUntilLoaded(); // necessary so that load errors are passed on to the caller
} catch (AggregateException ex) { } catch (AggregateException ex) {
language.WriteCommentLine(output, assembly.FileName); language.WriteCommentLine(output, LoadedAssembly.FileName);
switch (ex.InnerException) { switch (ex.InnerException) {
case BadImageFormatException badImage: case BadImageFormatException badImage:
HandleException(badImage, "This file does not contain a managed assembly."); HandleException(badImage, "This file does not contain a managed assembly.");
@ -282,7 +266,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
throw; throw;
} }
} }
language.DecompileAssembly(assembly, output, options); language.DecompileAssembly(LoadedAssembly, output, options);
} }
public override bool Save(DecompilerTextView textView) public override bool Save(DecompilerTextView textView)
@ -291,7 +275,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
if (string.IsNullOrEmpty(language.ProjectFileExtension)) if (string.IsNullOrEmpty(language.ProjectFileExtension))
return false; return false;
SaveFileDialog dlg = new SaveFileDialog(); SaveFileDialog dlg = new SaveFileDialog();
dlg.FileName = DecompilerTextView.CleanUpName(assembly.ShortName) + language.ProjectFileExtension; dlg.FileName = DecompilerTextView.CleanUpName(LoadedAssembly.ShortName) + language.ProjectFileExtension;
dlg.Filter = language.Name + " project|*" + language.ProjectFileExtension + "|" + language.Name + " single file|*" + language.FileExtension + "|All files|*.*"; dlg.Filter = language.Name + " project|*" + language.ProjectFileExtension + "|" + language.Name + " single file|*" + language.FileExtension + "|All files|*.*";
if (dlg.ShowDialog() == true) { if (dlg.ShowDialog() == true) {
DecompilationOptions options = new DecompilationOptions(); DecompilationOptions options = new DecompilationOptions();
@ -320,7 +304,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
{ {
// ToString is used by FindNodeByPath/GetPathForNode // ToString is used by FindNodeByPath/GetPathForNode
// Fixes #821 - Reload All Assemblies Should Point to the Correct Assembly // Fixes #821 - Reload All Assemblies Should Point to the Correct Assembly
return assembly.FileName; return LoadedAssembly.FileName;
} }
} }
@ -421,7 +405,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
{ {
if (context.SelectedTreeNodes == null) if (context.SelectedTreeNodes == null)
return false; return false;
return context.SelectedTreeNodes.Where(n => n is AssemblyTreeNode).Any(n=>((AssemblyTreeNode)n).IsAutoLoaded); return context.SelectedTreeNodes.Where(n => n is AssemblyTreeNode).Any(n => ((AssemblyTreeNode)n).IsAutoLoaded);
} }
public bool IsEnabled(TextViewContext context) public bool IsEnabled(TextViewContext context)

2
ILSpy/TreeNodes/ReferenceFolderTreeNode.cs

@ -57,7 +57,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
var metadata = module.Metadata; var metadata = module.Metadata;
foreach (var r in module.AssemblyReferences.OrderBy(r => r.Name)) foreach (var r in module.AssemblyReferences.OrderBy(r => r.Name))
this.Children.Add(new AssemblyReferenceTreeNode(r, parentAssembly)); this.Children.Add(new AssemblyReferenceTreeNode(r, parentAssembly));
foreach (var r in module.ModuleReferences.OrderBy(r => metadata.GetString(metadata.GetModuleReference(r).Name))) foreach (var r in metadata.GetModuleReferences().OrderBy(r => metadata.GetString(metadata.GetModuleReference(r).Name)))
this.Children.Add(new ModuleReferenceTreeNode(r, metadata)); this.Children.Add(new ModuleReferenceTreeNode(r, metadata));
} }

Loading…
Cancel
Save