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;
}