From 2527a0b36e1e5db9fa7b24161dea3f5890db2f1f Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 18 Nov 2021 00:09:29 +0100 Subject: [PATCH] Fix #2550: Menu "Save Code" enable issue on changing C# version --- ILSpy/MainWindow.xaml.cs | 6 ------ ILSpy/TreeNodes/AssemblyTreeNode.cs | 2 +- ILSpy/TreeNodes/EventTreeNode.cs | 14 +++++++++++--- ILSpy/TreeNodes/FieldTreeNode.cs | 14 +++++++++++--- ILSpy/TreeNodes/MethodTreeNode.cs | 14 +++++++++++--- ILSpy/TreeNodes/PropertyTreeNode.cs | 17 ++++++++++------- ILSpy/TreeNodes/TypeTreeNode.cs | 14 +++++++++++--- 7 files changed, 55 insertions(+), 26 deletions(-) diff --git a/ILSpy/MainWindow.xaml.cs b/ILSpy/MainWindow.xaml.cs index 7f1c9070d..bbd390da2 100644 --- a/ILSpy/MainWindow.xaml.cs +++ b/ILSpy/MainWindow.xaml.cs @@ -824,7 +824,6 @@ namespace ICSharpCode.ILSpy void filterSettings_PropertyChanged(object sender, PropertyChangedEventArgs e) { - RefreshTreeView(); RefreshTreeViewFilter(); if (e.PropertyName == "Language" || e.PropertyName == "LanguageVersion") { @@ -1173,11 +1172,6 @@ namespace ICSharpCode.ILSpy } void RefreshCommandExecuted(object sender, ExecutedRoutedEventArgs e) - { - RefreshTreeView(); - } - - void RefreshTreeView() { try { diff --git a/ILSpy/TreeNodes/AssemblyTreeNode.cs b/ILSpy/TreeNodes/AssemblyTreeNode.cs index 19b4df1b8..da10af18c 100644 --- a/ILSpy/TreeNodes/AssemblyTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyTreeNode.cs @@ -200,7 +200,7 @@ namespace ICSharpCode.ILSpy.TreeNodes void LoadChildrenForPEFile(PEFile module) { - typeSystem = LoadedAssembly.GetTypeSystemOrNull(DecompilerTypeSystem.GetOptions(new DecompilationOptions().DecompilerSettings)); + typeSystem = LoadedAssembly.GetTypeSystemOrNull(); var assembly = (MetadataModule)typeSystem.MainModule; this.Children.Add(new Metadata.MetadataTreeNode(module, this)); Decompiler.DebugInfo.IDebugInfoProvider debugInfo = LoadedAssembly.GetDebugInfoOrNull(); diff --git a/ILSpy/TreeNodes/EventTreeNode.cs b/ILSpy/TreeNodes/EventTreeNode.cs index 38ad76f5b..b9cce0968 100644 --- a/ILSpy/TreeNodes/EventTreeNode.cs +++ b/ILSpy/TreeNodes/EventTreeNode.cs @@ -17,6 +17,7 @@ // DEALINGS IN THE SOFTWARE. using System; +using System.Reflection.Metadata; using System.Windows.Media; using ICSharpCode.Decompiler; @@ -45,14 +46,21 @@ namespace ICSharpCode.ILSpy.TreeNodes public IEvent EventDefinition { get; } - public override object Text => GetText(EventDefinition, this.Language) + EventDefinition.MetadataToken.ToSuffixString(); + public override object Text => GetText(GetEventDefinition(), this.Language) + EventDefinition.MetadataToken.ToSuffixString(); + + private IEvent GetEventDefinition() + { + return ((MetadataModule)EventDefinition.ParentModule.PEFile + ?.GetTypeSystemWithCurrentOptionsOrNull() + ?.MainModule)?.GetDefinition((EventDefinitionHandle)EventDefinition.MetadataToken) ?? EventDefinition; + } public static object GetText(IEvent ev, Language language) { return language.EventToString(ev, false, false, false); } - public override object Icon => GetIcon(EventDefinition); + public override object Icon => GetIcon(GetEventDefinition()); public static ImageSource GetIcon(IEvent @event) { @@ -76,7 +84,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override bool IsPublicAPI { get { - switch (EventDefinition.Accessibility) + switch (GetEventDefinition().Accessibility) { case Accessibility.Public: case Accessibility.ProtectedOrInternal: diff --git a/ILSpy/TreeNodes/FieldTreeNode.cs b/ILSpy/TreeNodes/FieldTreeNode.cs index a997c2547..fab2c6ae4 100644 --- a/ILSpy/TreeNodes/FieldTreeNode.cs +++ b/ILSpy/TreeNodes/FieldTreeNode.cs @@ -17,6 +17,7 @@ // DEALINGS IN THE SOFTWARE. using System; +using System.Reflection.Metadata; using System.Windows.Media; using ICSharpCode.Decompiler; @@ -37,14 +38,21 @@ namespace ICSharpCode.ILSpy.TreeNodes this.FieldDefinition = field ?? throw new ArgumentNullException(nameof(field)); } - public override object Text => GetText(FieldDefinition, Language) + FieldDefinition.MetadataToken.ToSuffixString(); + public override object Text => GetText(GetFieldDefinition(), Language) + FieldDefinition.MetadataToken.ToSuffixString(); + + private IField GetFieldDefinition() + { + return ((MetadataModule)FieldDefinition.ParentModule.PEFile + ?.GetTypeSystemWithCurrentOptionsOrNull() + ?.MainModule)?.GetDefinition((FieldDefinitionHandle)FieldDefinition.MetadataToken) ?? FieldDefinition; + } public static object GetText(IField field, Language language) { return language.FieldToString(field, includeDeclaringTypeName: false, includeNamespace: false, includeNamespaceOfDeclaringTypeName: false); } - public override object Icon => GetIcon(FieldDefinition); + public override object Icon => GetIcon(GetFieldDefinition()); public static ImageSource GetIcon(IField field) { @@ -77,7 +85,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override bool IsPublicAPI { get { - switch (FieldDefinition.Accessibility) + switch (GetFieldDefinition().Accessibility) { case Accessibility.Public: case Accessibility.Protected: diff --git a/ILSpy/TreeNodes/MethodTreeNode.cs b/ILSpy/TreeNodes/MethodTreeNode.cs index 474639b94..408e5a36e 100644 --- a/ILSpy/TreeNodes/MethodTreeNode.cs +++ b/ILSpy/TreeNodes/MethodTreeNode.cs @@ -17,6 +17,7 @@ // DEALINGS IN THE SOFTWARE. using System; +using System.Reflection.Metadata; using System.Windows.Media; using ICSharpCode.Decompiler; @@ -37,14 +38,21 @@ namespace ICSharpCode.ILSpy.TreeNodes this.MethodDefinition = method ?? throw new ArgumentNullException(nameof(method)); } - public override object Text => GetText(MethodDefinition, Language) + MethodDefinition.MetadataToken.ToSuffixString(); + public override object Text => GetText(GetMethodDefinition(), Language) + MethodDefinition.MetadataToken.ToSuffixString(); + + private IMethod GetMethodDefinition() + { + return ((MetadataModule)MethodDefinition.ParentModule.PEFile + ?.GetTypeSystemWithCurrentOptionsOrNull() + ?.MainModule)?.GetDefinition((MethodDefinitionHandle)MethodDefinition.MetadataToken) ?? MethodDefinition; + } public static object GetText(IMethod method, Language language) { return language.MethodToString(method, false, false, false); } - public override object Icon => GetIcon(MethodDefinition); + public override object Icon => GetIcon(GetMethodDefinition()); public static ImageSource GetIcon(IMethod method) { @@ -102,7 +110,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override bool IsPublicAPI { get { - switch (MethodDefinition.Accessibility) + switch (GetMethodDefinition().Accessibility) { case Accessibility.Public: case Accessibility.Protected: diff --git a/ILSpy/TreeNodes/PropertyTreeNode.cs b/ILSpy/TreeNodes/PropertyTreeNode.cs index 5dec47290..e8e2e149d 100644 --- a/ILSpy/TreeNodes/PropertyTreeNode.cs +++ b/ILSpy/TreeNodes/PropertyTreeNode.cs @@ -17,14 +17,10 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Reflection; using System.Reflection.Metadata; using System.Windows.Media; using ICSharpCode.Decompiler; -using ICSharpCode.Decompiler.Metadata; - -using SRM = System.Reflection.Metadata; namespace ICSharpCode.ILSpy.TreeNodes { @@ -52,14 +48,21 @@ namespace ICSharpCode.ILSpy.TreeNodes public IProperty PropertyDefinition { get; } - public override object Text => GetText(PropertyDefinition, Language) + PropertyDefinition.MetadataToken.ToSuffixString(); + public override object Text => GetText(GetPropertyDefinition(), Language) + PropertyDefinition.MetadataToken.ToSuffixString(); + + private IProperty GetPropertyDefinition() + { + return ((MetadataModule)PropertyDefinition.ParentModule.PEFile + ?.GetTypeSystemWithCurrentOptionsOrNull() + ?.MainModule)?.GetDefinition((PropertyDefinitionHandle)PropertyDefinition.MetadataToken) ?? PropertyDefinition; + } public static object GetText(IProperty property, Language language) { return language.PropertyToString(property, false, false, false); } - public override object Icon => GetIcon(PropertyDefinition); + public override object Icon => GetIcon(GetPropertyDefinition()); public static ImageSource GetIcon(IProperty property) { @@ -84,7 +87,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override bool IsPublicAPI { get { - switch (PropertyDefinition.Accessibility) + switch (GetPropertyDefinition().Accessibility) { case Accessibility.Public: case Accessibility.ProtectedOrInternal: diff --git a/ILSpy/TreeNodes/TypeTreeNode.cs b/ILSpy/TreeNodes/TypeTreeNode.cs index 92739230e..3cb5ca3a4 100644 --- a/ILSpy/TreeNodes/TypeTreeNode.cs +++ b/ILSpy/TreeNodes/TypeTreeNode.cs @@ -41,12 +41,20 @@ namespace ICSharpCode.ILSpy.TreeNodes public AssemblyTreeNode ParentAssemblyNode { get; } - public override object Text => this.Language.TypeToString(TypeDefinition, includeNamespace: false) + public override object Text => this.Language.TypeToString(GetTypeDefinition(), includeNamespace: false) + TypeDefinition.MetadataToken.ToSuffixString(); + private ITypeDefinition GetTypeDefinition() + { + return ((MetadataModule)ParentAssemblyNode.LoadedAssembly + .GetPEFileOrNull() + ?.GetTypeSystemWithCurrentOptionsOrNull() + ?.MainModule).GetDefinition((SRM.TypeDefinitionHandle)TypeDefinition.MetadataToken); + } + public override bool IsPublicAPI { get { - switch (TypeDefinition.Accessibility) + switch (GetTypeDefinition().Accessibility) { case Accessibility.Public: case Accessibility.Protected: @@ -120,7 +128,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) { - language.DecompileType(TypeDefinition, output, options); + language.DecompileType(GetTypeDefinition(), output, options); } public override object Icon => GetIcon(TypeDefinition);