Browse Source

Update TransformCollectionAndObjectInitializers to check for init-only properties (#3678)

pull/3681/head
Nikita 3 weeks ago committed by GitHub
parent
commit
9ed96224b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  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.DeclaringTypeDefinition)
&& !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