From 1d2a08aeed41a28a0254938749a2fc449cbdf837 Mon Sep 17 00:00:00 2001 From: honzapatCZ Date: Sat, 27 Jun 2026 23:01:00 +0200 Subject: [PATCH] AMP fixup initializers -> proper defaults --- AutoMapProperty/AutoMapProperty.cs | 43 ++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/AutoMapProperty/AutoMapProperty.cs b/AutoMapProperty/AutoMapProperty.cs index f2247f0..4bc22a6 100644 --- a/AutoMapProperty/AutoMapProperty.cs +++ b/AutoMapProperty/AutoMapProperty.cs @@ -243,6 +243,17 @@ namespace AutoMapProperty { INamedTypeSymbol dataTypename = attr?.ConstructorArguments[1].Value as INamedTypeSymbol; mem = mem.WithType(SyntaxFactory.ParseTypeName(dataTypename.ToDisplayString() + " ")); + + var oldConcreteType = GetConcreteType(propSymbol.Type); + var newConcreteType = GetConcreteType(dataTypename); + + if (mem.Initializer != null && !SymbolEqualityComparer.Default.Equals(oldConcreteType, newConcreteType)) + { + var rewriter = new TypeReplacer(oldConcreteType.Name, newConcreteType.Name); + var newInitializer = (EqualsValueClauseSyntax)rewriter.Visit(mem.Initializer); + mem = mem.WithInitializer(newInitializer); + } + typeSymbol = dataTypename; } @@ -262,7 +273,7 @@ namespace AutoMapProperty }))); //if property has initializer or expression body, remove them - mem = mem.WithInitializer(null); + //mem = mem.WithInitializer(null); mem = mem.WithExpressionBody(null); //if property is abstract remove the abstract modifier @@ -272,7 +283,14 @@ namespace AutoMapProperty } //now the has trailing semicolon, which is wrong - mem = mem.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.None)); + if (mem.Initializer == null) + { + mem = mem.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.None)); + } + else + { + mem = mem.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)); + } //if we dont want to generate converter bool customFrom = false; @@ -1035,6 +1053,27 @@ namespace ").Append(classToGenerate.Namespace).Append(@" return sb.ToString(); } + + private class TypeReplacer : CSharpSyntaxRewriter + { + private readonly string _oldTypeName; + private readonly string _newTypeName; + + public TypeReplacer(string oldTypeName, string newTypeName) + { + _oldTypeName = oldTypeName; + _newTypeName = newTypeName; + } + + public override SyntaxNode? VisitIdentifierName(IdentifierNameSyntax node) + { + if (node.Identifier.ValueText == _oldTypeName) + { + return SyntaxFactory.IdentifierName(_newTypeName).WithTriviaFrom(node); + } + return base.VisitIdentifierName(node); + } + } } public static class Utils