diff --git a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs index 07a4126de..ffc4ba042 100644 --- a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs @@ -1742,7 +1742,7 @@ namespace ICSharpCode.Decompiler.CSharp AddAnnotationsToDeclaration(method, entityDecl, function); - var localSettings = settings.Clone(); + var localSettings = settings.DeepClone(); if (IsWindowsFormsInitializeComponentMethod(method)) { localSettings.UseImplicitMethodGroupConversion = false; diff --git a/ICSharpCode.Decompiler/DecompilerSettings.cs b/ICSharpCode.Decompiler/DecompilerSettings.cs index 02bfd027c..ae314aacf 100644 --- a/ICSharpCode.Decompiler/DecompilerSettings.cs +++ b/ICSharpCode.Decompiler/DecompilerSettings.cs @@ -27,7 +27,7 @@ namespace ICSharpCode.Decompiler /// /// Settings for the decompiler. /// - public class DecompilerSettings : INotifyPropertyChanged + public record class DecompilerSettings : INotifyPropertyChanged { /// /// Equivalent to new DecompilerSettings(LanguageVersion.Latest) @@ -2238,9 +2238,11 @@ namespace ICSharpCode.Decompiler } } - public DecompilerSettings Clone() + protected virtual DecompilerSettings ShallowClone() => this with { }; + + public DecompilerSettings DeepClone() { - DecompilerSettings settings = (DecompilerSettings)MemberwiseClone(); + DecompilerSettings settings = ShallowClone(); if (csharpFormattingOptions != null) settings.csharpFormattingOptions = csharpFormattingOptions.Clone(); settings.PropertyChanged = null; diff --git a/ILSpy/DecompilationOptions.cs b/ILSpy/DecompilationOptions.cs index c7c87322d..8eca4ef43 100644 --- a/ILSpy/DecompilationOptions.cs +++ b/ILSpy/DecompilationOptions.cs @@ -90,7 +90,7 @@ namespace ICSharpCode.ILSpy if (!Enum.TryParse(version?.Version, out Decompiler.CSharp.LanguageVersion languageVersion)) languageVersion = Decompiler.CSharp.LanguageVersion.Latest; - var newSettings = this.DecompilerSettings = settings.Clone(); + var newSettings = this.DecompilerSettings = settings.DeepClone(); newSettings.SetLanguageVersion(languageVersion); newSettings.ExpandMemberDefinitions = displaySettings.ExpandMemberDefinitions; diff --git a/ILSpy/ExtensionMethods.cs b/ILSpy/ExtensionMethods.cs index f0d3e8f14..498e89636 100644 --- a/ILSpy/ExtensionMethods.cs +++ b/ILSpy/ExtensionMethods.cs @@ -78,7 +78,7 @@ namespace ICSharpCode.ILSpy public static ICompilation? GetTypeSystemWithCurrentOptionsOrNull(this MetadataFile file, SettingsService settingsService, LanguageVersion languageVersion) { - var decompilerSettings = settingsService.DecompilerSettings.Clone(); + var decompilerSettings = settingsService.DecompilerSettings.DeepClone(); if (!Enum.TryParse(languageVersion?.Version, out Decompiler.CSharp.LanguageVersion csharpLanguageVersion)) csharpLanguageVersion = Decompiler.CSharp.LanguageVersion.Latest; decompilerSettings.SetLanguageVersion(csharpLanguageVersion); diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index 73336640e..c67fe9048 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -578,7 +578,7 @@ namespace ICSharpCode.ILSpy CSharpAmbience ambience = new CSharpAmbience(); // Do not forget to update CSharpAmbienceTests.ILSpyMainTreeViewTypeFlags, if this ever changes. ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList | ConversionFlags.PlaceReturnTypeAfterParameterList; - var decompilerSettings = SettingsService.DecompilerSettings.Clone(); + var decompilerSettings = SettingsService.DecompilerSettings.DeepClone(); if (!Enum.TryParse(AssemblyTreeModel.CurrentLanguageVersion?.Version, out Decompiler.CSharp.LanguageVersion languageVersion)) languageVersion = Decompiler.CSharp.LanguageVersion.Latest; decompilerSettings.SetLanguageVersion(languageVersion); @@ -789,7 +789,7 @@ namespace ICSharpCode.ILSpy public override bool ShowMember(IEntity member) { MetadataFile assembly = member.ParentModule.MetadataFile; - var decompilerSettings = SettingsService.DecompilerSettings.Clone(); + var decompilerSettings = SettingsService.DecompilerSettings.DeepClone(); if (!Enum.TryParse(AssemblyTreeModel.CurrentLanguageVersion?.Version, out Decompiler.CSharp.LanguageVersion languageVersion)) languageVersion = Decompiler.CSharp.LanguageVersion.Latest; decompilerSettings.SetLanguageVersion(languageVersion); @@ -802,7 +802,7 @@ namespace ICSharpCode.ILSpy var output = new StringWriter(); var decoratedWriter = new TextWriterTokenWriter(output); var writer = new CSharpHighlightingTokenWriter(TokenWriter.InsertRequiredSpaces(decoratedWriter), locatable: decoratedWriter); - var settings = SettingsService.DecompilerSettings.Clone(); + var settings = SettingsService.DecompilerSettings.DeepClone(); if (!Enum.TryParse(AssemblyTreeModel.CurrentLanguageVersion?.Version, out Decompiler.CSharp.LanguageVersion languageVersion)) languageVersion = Decompiler.CSharp.LanguageVersion.Latest; settings.SetLanguageVersion(languageVersion); diff --git a/ILSpy/Options/DecompilerSettings.cs b/ILSpy/Options/DecompilerSettings.cs index 0b87807ee..1a6acf896 100644 --- a/ILSpy/Options/DecompilerSettings.cs +++ b/ILSpy/Options/DecompilerSettings.cs @@ -27,7 +27,7 @@ using System.Xml.Linq; namespace ICSharpCode.ILSpy.Options { - public class DecompilerSettings : Decompiler.DecompilerSettings, ISettingsSection + public record class DecompilerSettings : Decompiler.DecompilerSettings, ISettingsSection { static readonly PropertyInfo[] properties = typeof(Decompiler.DecompilerSettings).GetProperties() .Where(p => p.GetCustomAttribute()?.Browsable != false) @@ -57,14 +57,9 @@ namespace ICSharpCode.ILSpy.Options } } - public new DecompilerSettings Clone() + public new DecompilerSettings DeepClone() { - var section = SaveToXml(); - - var newSettings = new DecompilerSettings(); - newSettings.LoadFromXml(section); - - return newSettings; + return (DecompilerSettings)base.DeepClone(); } } } diff --git a/ILSpy/Search/SearchPane.xaml.cs b/ILSpy/Search/SearchPane.xaml.cs index 4eeb96f55..883e68702 100644 --- a/ILSpy/Search/SearchPane.xaml.cs +++ b/ILSpy/Search/SearchPane.xaml.cs @@ -474,11 +474,11 @@ namespace ICSharpCode.ILSpy.Search request.RegEx = regex; request.SearchResultFactory = new SearchResultFactory(language); request.TreeNodeFactory = this.treeNodeFactory; - var decompilerSettings = settingsService.DecompilerSettings.Clone(); + var decompilerSettings = settingsService.DecompilerSettings.DeepClone(); if (!Enum.TryParse(this.languageVersion?.Version, out Decompiler.CSharp.LanguageVersion languageVersion)) languageVersion = Decompiler.CSharp.LanguageVersion.Latest; decompilerSettings.SetLanguageVersion(languageVersion); - request.DecompilerSettings = settingsService.DecompilerSettings.Clone(); + request.DecompilerSettings = settingsService.DecompilerSettings.DeepClone(); return request; }