Browse Source

Fixed the issue where IsPrimaryConstructor's judgment was too conservative, which resulted in the inability to generate correct code in many scenarios.

pull/3598/head
sonyps5201314 3 months ago
parent
commit
e8f32ec592
  1. 20
      ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs

20
ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs

@ -198,25 +198,12 @@ namespace ICSharpCode.Decompiler.CSharp @@ -198,25 +198,12 @@ namespace ICSharpCode.Decompiler.CSharp
if (method.Parameters.Count == 0)
return false;
var addonInst = isStruct ? 1 : 2;
if (body.Instructions.Count < method.Parameters.Count + addonInst)
return false;
for (int i = 0; i < method.Parameters.Count; i++)
{
if (!body.Instructions[i].MatchStFld(out var target, out var field, out var valueInst))
return false;
break;
if (!target.MatchLdThis())
return false;
if (method.Parameters[i].ReferenceKind is ReferenceKind.In or ReferenceKind.RefReadOnly)
{
if (!valueInst.MatchLdObj(out valueInst, out _))
return false;
}
if (!valueInst.MatchLdLoc(out var value))
return false;
if (!(value.Kind == VariableKind.Parameter && value.Index == i))
return false;
IMember backingMember;
if (backingFieldToAutoProperty.TryGetValue(field, out var property))
{
@ -379,7 +366,10 @@ namespace ICSharpCode.Decompiler.CSharp @@ -379,7 +366,10 @@ namespace ICSharpCode.Decompiler.CSharp
internal (IProperty prop, IField field) GetPropertyInfoByPrimaryConstructorParameter(IParameter parameter)
{
var member = primaryCtorParameterToAutoPropertyOrBackingField[parameter];
if (!primaryCtorParameterToAutoPropertyOrBackingField.TryGetValue(parameter, out var member))
{
return (null, null);
}
if (member is IField field)
return (null, field);
return ((IProperty)member, autoPropertyToBackingField[(IProperty)member]);

Loading…
Cancel
Save