Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ ITypeSymbol targetPropertyType
argumentValues.Add(
BuildArgumentValue(
(AttributeArgumentSyntax)initializer.Syntax,
GetParameter(property.Name, validateMethodParameters),
property,
validateMethodParameters
)
);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ValidateClass>.Validate(ValidateClass? target) =>
Validate(target, []);

static global::Immediate.Validations.Shared.ValidationResult global::Immediate.Validations.Shared.IValidationTarget<ValidateClass>.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,
}
);
}
}
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -541,4 +541,46 @@ public partial class ValidateClass : IValidationTarget<ValidateClass>

_ = 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>(T target, T comparison) =>
EqualityComparer<T>.Default.Equals(target, comparison);

public static string DefaultMessage => "Values must match.";
}

[Validate]
public partial class ValidateClass : IValidationTarget<ValidateClass>
{
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);
}
}