diff --git a/src/Immediate.Validations.Generators/ValidateTargetTransformer.cs b/src/Immediate.Validations.Generators/ValidateTargetTransformer.cs index 2760386..a16f901 100644 --- a/src/Immediate.Validations.Generators/ValidateTargetTransformer.cs +++ b/src/Immediate.Validations.Generators/ValidateTargetTransformer.cs @@ -524,7 +524,7 @@ ITypeSymbol targetPropertyType argumentValues.Add( BuildArgumentValue( (AttributeArgumentSyntax)initializer.Syntax, - GetParameter(property.Name, validateMethodParameters), + property, validateMethodParameters ) ); diff --git a/tests/Immediate.Validations.Tests/GeneratorTests/Snapshots/ValidatorArgumentTests.NameOfInNamedArgument#IV...ValidateClass.g.verified.cs b/tests/Immediate.Validations.Tests/GeneratorTests/Snapshots/ValidatorArgumentTests.NameOfInNamedArgument#IV...ValidateClass.g.verified.cs new file mode 100644 index 0000000..bd1125f --- /dev/null +++ b/tests/Immediate.Validations.Tests/GeneratorTests/Snapshots/ValidatorArgumentTests.NameOfInNamedArgument#IV...ValidateClass.g.verified.cs @@ -0,0 +1,118 @@ +//HintName: IV...ValidateClass.g.cs +using System.Collections.Generic; +using Immediate.Validations.Shared; + +#nullable enable +#pragma warning disable CS1591 + + +partial class ValidateClass : global::Immediate.Validations.Shared.IValidationTarget +{ + global::Immediate.Validations.Shared.ValidationResult global::Immediate.Validations.Shared.IValidationTarget.Validate() => + Validate(this, []); + + global::Immediate.Validations.Shared.ValidationResult global::Immediate.Validations.Shared.IValidationTarget.Validate(global::Immediate.Validations.Shared.ValidationResult errors) => + Validate(this, errors); + + static global::Immediate.Validations.Shared.ValidationResult global::Immediate.Validations.Shared.IValidationTarget.Validate(ValidateClass? target) => + Validate(target, []); + + static global::Immediate.Validations.Shared.ValidationResult global::Immediate.Validations.Shared.IValidationTarget.Validate(ValidateClass? target, global::Immediate.Validations.Shared.ValidationResult errors) => + Validate(target, errors); + + public static global::Immediate.Validations.Shared.ValidationResult Validate(ValidateClass? target) => + Validate(target, []); + + public static global::Immediate.Validations.Shared.ValidationResult Validate(ValidateClass? target, global::Immediate.Validations.Shared.ValidationResult errors) + { + if (target is not { } t) + { + return new() + { + { ".self", "`target` must not be `null`." }, + }; + } + + if (!errors.VisitType(typeof(ValidateClass))) + return errors; + + + __ValidatePassword(errors, t, t.Password); + __ValidateConfirmation(errors, t, t.Confirmation); + + + return errors; + } + + + + private static void __ValidatePassword( + global::Immediate.Validations.Shared.ValidationResult errors, ValidateClass instance, string target + ) + { + + if (target is not { } t) + { + errors.Add( + $"Password", + global::Immediate.Validations.Shared.NotNullAttribute.DefaultMessage, + new() + { + ["PropertyName"] = $"Password", + ["PropertyValue"] = null, + } + ); + + return; + } + + + + } + + private static void __ValidateConfirmation( + global::Immediate.Validations.Shared.ValidationResult errors, ValidateClass instance, string target + ) + { + + if (target is not { } t) + { + errors.Add( + $"Confirmation", + global::Immediate.Validations.Shared.NotNullAttribute.DefaultMessage, + new() + { + ["PropertyName"] = $"Confirmation", + ["PropertyValue"] = null, + } + ); + + return; + } + + + + { + if (!global::MatchesAttribute.ValidateProperty( + t + , comparison: instance.Password + ) + ) + { + errors.Add( + $"Confirmation", + global::MatchesAttribute.DefaultMessage, + new() + { + ["PropertyName"] = $"Confirmation", + ["PropertyValue"] = t, + ["ComparisonName"] = "Password", + ["ComparisonValue"] = instance.Password, + } + ); + } + } + } + +} + diff --git a/tests/Immediate.Validations.Tests/GeneratorTests/ValidatorArgumentTests.cs b/tests/Immediate.Validations.Tests/GeneratorTests/ValidatorArgumentTests.cs index 454af82..bb6ed57 100644 --- a/tests/Immediate.Validations.Tests/GeneratorTests/ValidatorArgumentTests.cs +++ b/tests/Immediate.Validations.Tests/GeneratorTests/ValidatorArgumentTests.cs @@ -541,4 +541,46 @@ public partial class ValidateClass : IValidationTarget _ = await Verify(result); } + + [Fact] + public async Task NameOfInNamedArgument() + { + var result = GeneratorTestHelper.RunGenerator( + """ + #nullable enable + + using System.Collections.Generic; + using Immediate.Validations.Shared; + + public sealed class MatchesAttribute : ValidatorAttribute + { + [TargetType] + public required object Comparison { get; init; } + + public static bool ValidateProperty(T target, T comparison) => + EqualityComparer.Default.Equals(target, comparison); + + public static string DefaultMessage => "Values must match."; + } + + [Validate] + public partial class ValidateClass : IValidationTarget + { + public required string Password { get; init; } + + [Matches(Comparison = nameof(Password))] + public required string Confirmation { get; init; } + } + """ + ); + + Assert.Equal( + [ + @"Immediate.Validations.Generators/Immediate.Validations.Generators.ImmediateValidationsGenerator/IV...ValidateClass.g.cs", + ], + result.GeneratedTrees.Select(t => t.FilePath.Replace('\\', '/')) + ); + + _ = await Verify(result); + } }