Browse Source

Make `ILSpy` support `struct` and `record struct` types declared with a primary constructor and containing other constructors.

Here's an example:
```cs
    public record struct CopilotContextId_RecordStruct(Guid id)
    {
        public Guid guid { get; } = id;

        public CopilotContextId_RecordStruct() : this(Guid.NewGuid())
        {

        }
    }
    public struct CopilotContextId_Struct(Guid id)
    {
        public Guid guid { get; } = id;

        public CopilotContextId_Struct() : this(Guid.NewGuid())
        {

        }
    }
```
pull/3598/head
sonyps5201314 5 months ago
parent
commit
cae466e5b0
  1. 4
      ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs
  2. 9
      ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

4
ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs

@ -210,15 +210,11 @@ namespace ICSharpCode.Decompiler.CSharp @@ -210,15 +210,11 @@ namespace ICSharpCode.Decompiler.CSharp
{
if (!settings.UsePrimaryConstructorSyntax)
return null;
if (isStruct)
return null;
}
else
{
if (!settings.UsePrimaryConstructorSyntaxForNonRecordTypes)
return null;
if (isStruct)
return null;
}
var subst = recordTypeDef.AsParameterizedType().GetSubstitution();

9
ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

@ -166,7 +166,12 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -166,7 +166,12 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
}
};
static readonly AstNode thisCallPattern = new ExpressionStatement(new InvocationExpression(new MemberReferenceExpression(new ThisReferenceExpression(), ".ctor"), new Repeat(new AnyNode())));
static readonly AstNode thisCallPattern = new ExpressionStatement {
Expression = new Choice {
new InvocationExpression(new MemberReferenceExpression(new ThisReferenceExpression(), ".ctor"), new Repeat(new AnyNode())),
new AssignmentExpression(new ThisReferenceExpression(), AssignmentOperatorType.Assign, new ObjectCreateExpression(new AnyNode(), new Repeat(new AnyNode())))
}
};
public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration)
{
@ -191,7 +196,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -191,7 +196,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
{
var ctorMethodDef = instanceCtorsNotChainingWithThis[0].GetSymbol() as IMethod;
ITypeDefinition declaringTypeDefinition = ctorMethodDef?.DeclaringTypeDefinition;
if (ctorMethodDef != null && declaringTypeDefinition?.IsReferenceType == false && !declaringTypeDefinition.IsRecord)
if (ctorMethodDef != null && declaringTypeDefinition?.IsReferenceType == false && !declaringTypeDefinition.IsRecord && declaringTypeDefinition.Kind != TypeKind.Struct)
return;
bool ctorIsUnsafe = instanceCtorsNotChainingWithThis.All(c => c.HasModifier(Modifiers.Unsafe));

Loading…
Cancel
Save