Browse Source

Update TransformCollectionAndObjectInitializers to check for init-only properties

pull/3678/head
nikitalita 3 weeks ago
parent
commit
dabfc751b8
  1. 13
      ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

13
ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

@ -58,6 +58,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -58,6 +58,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
{
case NewObj newObjInst:
if (newObjInst.ILStackWasEmpty && v.Kind == VariableKind.Local
&& !TypeContainsInitOnlyProperties(newObjInst.Method.DeclaringType.GetDefinition())
&& !currentMethod.IsConstructor
&& !currentMethod.IsCompilerGeneratedOrIsInCompilerGeneratedClass())
{
@ -187,6 +188,18 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -187,6 +188,18 @@ namespace ICSharpCode.Decompiler.IL.Transforms
ILInlining.InlineIfPossible(block, pos, context);
}
private static bool TypeContainsInitOnlyProperties(ITypeDefinition? typeDefinition)
{
foreach (var property in typeDefinition?.Properties ?? [])
{
if (property.Setter?.IsInitOnly ?? false)
{
return true;
}
}
return false;
}
internal static bool IsRecordCloneMethodCall(CallInstruction ci)
{
if (ci.Method.DeclaringTypeDefinition?.IsRecord != true)

Loading…
Cancel
Save