From b8b9e2a013200dad884de2a36976771f76428d67 Mon Sep 17 00:00:00 2001 From: Lars Date: Mon, 26 Feb 2024 18:48:26 +0700 Subject: [PATCH] feat: report a diagnostic for invalid MapPropertyAttribute usages (#1130) --- src/Riok.Mapperly/AnalyzerReleases.Shipped.md | 1 + .../MapperConfigurationReader.cs | 5 +++++ .../MemberMappingConfiguration.cs | 2 ++ .../Diagnostics/DiagnosticDescriptors.cs | 9 ++++++++ .../Mapping/ObjectPropertyTest.cs | 21 +++++++++++++++++++ 5 files changed, 38 insertions(+) diff --git a/src/Riok.Mapperly/AnalyzerReleases.Shipped.md b/src/Riok.Mapperly/AnalyzerReleases.Shipped.md index 9841c7b8ba..d567dda277 100644 --- a/src/Riok.Mapperly/AnalyzerReleases.Shipped.md +++ b/src/Riok.Mapperly/AnalyzerReleases.Shipped.md @@ -151,3 +151,4 @@ RMG063 | Mapper | Error | Cannot configure an enum mapping on a non-enum m RMG064 | Mapper | Error | Cannot configure an object mapping on a non-object mapping RMG065 | Mapper | Warning | Cannot configure an object mapping on a queryable projection mapping, apply the configurations to an object mapping method instead RMG066 | Mapper | Warning | No members are mapped in an object mapping +RMG067 | Mapper | Error | Invalid usage of the MapPropertyAttribute diff --git a/src/Riok.Mapperly/Configuration/MapperConfigurationReader.cs b/src/Riok.Mapperly/Configuration/MapperConfigurationReader.cs index 99bb9c9dbd..31596f4fbc 100644 --- a/src/Riok.Mapperly/Configuration/MapperConfigurationReader.cs +++ b/src/Riok.Mapperly/Configuration/MapperConfigurationReader.cs @@ -106,6 +106,11 @@ private MembersMappingConfiguration BuildMembersConfig(MappingConfigurationRefer return MapperConfiguration.Members; } + foreach (var invalidMemberConfigs in memberConfigurations.Where(x => !x.IsValid)) + { + diagnostics.ReportDiagnostic(DiagnosticDescriptors.InvalidMapPropertyAttributeUsage, invalidMemberConfigs.Location); + } + return new MembersMappingConfiguration( ignoredSourceMembers, ignoredTargetMembers, diff --git a/src/Riok.Mapperly/Configuration/MemberMappingConfiguration.cs b/src/Riok.Mapperly/Configuration/MemberMappingConfiguration.cs index 45f270ae85..33a7569ee5 100644 --- a/src/Riok.Mapperly/Configuration/MemberMappingConfiguration.cs +++ b/src/Riok.Mapperly/Configuration/MemberMappingConfiguration.cs @@ -10,5 +10,7 @@ public record MemberMappingConfiguration(StringMemberPath Source, StringMemberPa public string? Use { get; set; } + public bool IsValid => Use == null || FormatProvider == null && StringFormat == null; + public TypeMappingConfiguration ToTypeMappingConfiguration() => new(StringFormat, FormatProvider, Use); } diff --git a/src/Riok.Mapperly/Diagnostics/DiagnosticDescriptors.cs b/src/Riok.Mapperly/Diagnostics/DiagnosticDescriptors.cs index a96af32fe4..1b1635d0f4 100644 --- a/src/Riok.Mapperly/Diagnostics/DiagnosticDescriptors.cs +++ b/src/Riok.Mapperly/Diagnostics/DiagnosticDescriptors.cs @@ -583,6 +583,15 @@ public static class DiagnosticDescriptors helpLinkUri: BuildHelpUri("RMG066") ); + public static readonly DiagnosticDescriptor InvalidMapPropertyAttributeUsage = new DiagnosticDescriptor( + "RMG067", + "Invalid usage of the MapPropertyAttribute", + "Invalid usage of the MapPropertyAttribute", + DiagnosticCategories.Mapper, + DiagnosticSeverity.Error, + true + ); + private static string BuildHelpUri(string id) { #if ENV_NEXT diff --git a/test/Riok.Mapperly.Tests/Mapping/ObjectPropertyTest.cs b/test/Riok.Mapperly.Tests/Mapping/ObjectPropertyTest.cs index f39b16a37f..4b6f4c3f4f 100644 --- a/test/Riok.Mapperly.Tests/Mapping/ObjectPropertyTest.cs +++ b/test/Riok.Mapperly.Tests/Mapping/ObjectPropertyTest.cs @@ -496,4 +496,25 @@ public void ModifyingPathIfClassPrecedesShouldNotDiagnostic() """ ); } + + [Fact] + public void InvalidMapPropertyAttributeUsageShouldDiagnostic() + { + var source = TestSourceBuilder.MapperWithBodyAndTypes( + """ + [MapProperty("IntValue", "StringValue", StringFormat = "D", Use = nameof(IntToString))] + partial B Map(A src); + + string IntToString(int x) => x.ToString(); + """, + "class A { public int IntValue { get; set; } }", + "class B { public string StringValue { get; set; } }" + ); + + TestHelper + .GenerateMapper(source, TestHelperOptions.AllowDiagnostics) + .Should() + .HaveDiagnostic(DiagnosticDescriptors.InvalidMapPropertyAttributeUsage, "Invalid usage of the MapPropertyAttribute") + .HaveAssertedAllDiagnostics(); + } }