diff --git a/SourceGenerators/Mapper/MintPlayer.Mapper/AnalyzerReleases.Unshipped.md b/SourceGenerators/Mapper/MintPlayer.Mapper/AnalyzerReleases.Unshipped.md index ca11c578..4b80cba1 100644 --- a/SourceGenerators/Mapper/MintPlayer.Mapper/AnalyzerReleases.Unshipped.md +++ b/SourceGenerators/Mapper/MintPlayer.Mapper/AnalyzerReleases.Unshipped.md @@ -7,5 +7,5 @@ Rule ID | Category | Severity | Notes --------|----------|----------|------- MAPC001 | MapperGenerator | Error | DiagnosticRules MAPC002 | MapperGenerator | Error | DiagnosticRules -MAPC003 | MapperGenerator | Error | DiagnosticRules +MAPC003 | Mapping | Warning | DiagnosticRules MAPC004 | MapperGenerator | Error | DiagnosticRules \ No newline at end of file diff --git a/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.Producer.cs b/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.Producer.cs index 6a9fb3ca..83bbe938 100644 --- a/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.Producer.cs +++ b/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.Producer.cs @@ -26,7 +26,9 @@ public IEnumerable GetDiagnostics() EAppliedOn.Assembly => DiagnosticRules.GenerateMapperTwoParameters.Create(type.TypeToMap.Location), _ => null, }) - .NotNull(); + .NotNull() + .Concat() + ; } protected override void ProduceSource(IndentedTextWriter writer, CancellationToken cancellationToken) @@ -294,6 +296,9 @@ private static string GetElementType(string collectionType) private static void HandleProperty(IndentedTextWriter writer, PropertyDeclaration source, PropertyDeclaration destination, EWriteType writeType) { + // Skip init-only properties for assignment + if (destination.IsInitOnly) return; + var prefix = writeType switch { EWriteType.Initializer => $"{source.PropertyName} = ", diff --git a/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.Rules.cs b/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.Rules.cs index f68acad1..ca7c2be9 100644 --- a/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.Rules.cs +++ b/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.Rules.cs @@ -19,4 +19,12 @@ public static partial class DiagnosticRules category: "MapperGenerator", defaultSeverity: DiagnosticSeverity.Error, isEnabledByDefault: true); + + public static readonly DiagnosticDescriptor InitOnlyPropertyNotMapped = new( + id: "MAPC003", + title: "Init-only property not mapped", + messageFormat: "The property '{0}' on type '{1}' is init-only and will not be mapped from '{2}'", + category: "Mapping", + defaultSeverity: DiagnosticSeverity.Warning, + isEnabledByDefault: true); } \ No newline at end of file diff --git a/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.cs b/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.cs index d459ac53..29380d0d 100644 --- a/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.cs +++ b/SourceGenerators/Mapper/MintPlayer.Mapper/Generators/MapperGenerator.cs @@ -273,6 +273,7 @@ private static string CreateMethodName(TypedConstant preferred, INamedTypeSymbol //IsNullable = p.NullableAnnotation == NullableAnnotation.Annotated, //IsReadOnly = p.IsReadOnly, IsStatic = p.IsStatic, + IsInitOnly = p.SetMethod is { IsInitOnly: true }, //IsVirtual = p.IsVirtual, //IsAbstract = p.IsAbstract, //IsOverride = p.IsOverride, diff --git a/SourceGenerators/Mapper/MintPlayer.Mapper/Models/PropertyDeclaration.cs b/SourceGenerators/Mapper/MintPlayer.Mapper/Models/PropertyDeclaration.cs index bc37b746..07213eab 100644 --- a/SourceGenerators/Mapper/MintPlayer.Mapper/Models/PropertyDeclaration.cs +++ b/SourceGenerators/Mapper/MintPlayer.Mapper/Models/PropertyDeclaration.cs @@ -12,6 +12,7 @@ public partial class PropertyDeclaration public int? StateName { get; set; } public bool IsStatic { get; set; } public bool IsPrimitive { get; set; } + public bool IsInitOnly { get; set; } public override string ToString() => $"{PropertyName} ({PropertyType})"; }