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
{ {
if (!settings.UsePrimaryConstructorSyntax) if (!settings.UsePrimaryConstructorSyntax)
return null; return null;
if (isStruct)
return null;
} }
else else
{ {
if (!settings.UsePrimaryConstructorSyntaxForNonRecordTypes) if (!settings.UsePrimaryConstructorSyntaxForNonRecordTypes)
return null; return null;
if (isStruct)
return null;
} }
var subst = recordTypeDef.AsParameterizedType().GetSubstitution(); var subst = recordTypeDef.AsParameterizedType().GetSubstitution();

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

@ -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) public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration)
{ {
@ -191,7 +196,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
{ {
var ctorMethodDef = instanceCtorsNotChainingWithThis[0].GetSymbol() as IMethod; var ctorMethodDef = instanceCtorsNotChainingWithThis[0].GetSymbol() as IMethod;
ITypeDefinition declaringTypeDefinition = ctorMethodDef?.DeclaringTypeDefinition; 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; return;
bool ctorIsUnsafe = instanceCtorsNotChainingWithThis.All(c => c.HasModifier(Modifiers.Unsafe)); bool ctorIsUnsafe = instanceCtorsNotChainingWithThis.All(c => c.HasModifier(Modifiers.Unsafe));

Loading…
Cancel
Save