Browse Source

#3452: Transform field initializers in structs only if no record and no primary ctor.

pull/3613/head
Siegfried Pammer 2 months ago
parent
commit
7a5a2a00a9
  1. 11
      ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs

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

@ -50,7 +50,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
{ {
// If we're viewing some set of members (fields are direct children of SyntaxTree), // If we're viewing some set of members (fields are direct children of SyntaxTree),
// we also need to handle those: // we also need to handle those:
HandleInstanceFieldInitializers(node.Children, context.CurrentTypeDefinition); HandleInstanceFieldInitializers(node.Children, null, context.CurrentTypeDefinition);
HandleStaticFieldInitializers(node.Children, context.CurrentTypeDefinition); HandleStaticFieldInitializers(node.Children, context.CurrentTypeDefinition);
node.AcceptVisitor(this); node.AcceptVisitor(this);
@ -173,7 +173,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
var currentTypeDefinition = (ITypeDefinition)typeDeclaration.GetSymbol(); var currentTypeDefinition = (ITypeDefinition)typeDeclaration.GetSymbol();
// Handle initializers on instance fields // Handle initializers on instance fields
HandleInstanceFieldInitializers(typeDeclaration.Members, currentTypeDefinition); HandleInstanceFieldInitializers(typeDeclaration.Members, typeDeclaration, currentTypeDefinition);
// Now convert base constructor calls to initializers: // Now convert base constructor calls to initializers:
base.VisitTypeDeclaration(typeDeclaration); base.VisitTypeDeclaration(typeDeclaration);
@ -200,10 +200,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
return true; return true;
} }
void HandleInstanceFieldInitializers(IEnumerable<AstNode> members, ITypeDefinition currentTypeDefinition) void HandleInstanceFieldInitializers(IEnumerable<AstNode> members, EntityDeclaration entityDeclaration, ITypeDefinition currentTypeDefinition)
{ {
if (currentTypeDefinition is { Kind: TypeKind.Struct, IsRecord: false } if (!context.Settings.StructDefaultConstructorsAndFieldInitializers
&& !context.Settings.StructDefaultConstructorsAndFieldInitializers) && currentTypeDefinition is { Kind: TypeKind.Struct, IsRecord: false }
&& entityDeclaration is TypeDeclaration { HasPrimaryConstructor: false })
{ {
return; return;
} }

Loading…
Cancel
Save