Skip to content

Commit 2ab24bb

Browse files
committed
WIP
1 parent f5ef457 commit 2ab24bb

8 files changed

+395
-127
lines changed

src/Validation/gen/Parsers/ValidationsGenerator.TypesParser.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public sealed partial class ValidationsGenerator : IIncrementalGenerator
2020
globalNamespaceStyle: SymbolDisplayGlobalNamespaceStyle.Included,
2121
typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces);
2222

23+
private static INamedTypeSymbol? _skipValidationAttribute;
24+
2325
internal ImmutableArray<ValidatableType> ExtractValidatableTypes(IInvocationOperation operation, WellKnownTypes wellKnownTypes)
2426
{
2527
AnalyzerDebug.Assert(operation.SemanticModel != null, "SemanticModel should not be null.");
@@ -43,6 +45,12 @@ internal ImmutableArray<ValidatableType> ExtractValidatableTypes(IInvocationOper
4345
continue;
4446
}
4547

48+
// Skip parameter if it or its type are annotated with SkipValidationAttribute
49+
if (SymbolOrTypeHasAttribute(parameter, parameter.Type, GetSkipValidationAttribute(wellKnownTypes)))
50+
{
51+
continue;
52+
}
53+
4654
_ = TryExtractValidatableType(parameter.Type, wellKnownTypes, ref validatableTypes, ref visitedTypes);
4755
}
4856
return [.. validatableTypes];
@@ -115,8 +123,6 @@ internal ImmutableArray<ValidatableProperty> ExtractValidatableMembers(ITypeSymb
115123
WellKnownTypeData.WellKnownType.Microsoft_AspNetCore_Http_Metadata_IFromServiceMetadata);
116124
var fromKeyedServiceAttributeSymbol = wellKnownTypes.Get(
117125
WellKnownTypeData.WellKnownType.Microsoft_Extensions_DependencyInjection_FromKeyedServicesAttribute);
118-
var skipValidationAttributeSymbol = wellKnownTypes.Get(
119-
WellKnownTypeData.WellKnownType.Microsoft_Extensions_Validation_SkipValidationAttribute);
120126

121127
// Special handling for record types to extract properties from
122128
// the primary constructor.
@@ -152,7 +158,7 @@ internal ImmutableArray<ValidatableProperty> ExtractValidatableMembers(ITypeSymb
152158
}
153159

154160
// Skip parameter if it or its type are annotated with SkipValidationAttribute
155-
if (SymbolOrTypeHasAttribute(parameter, parameter.Type, skipValidationAttributeSymbol))
161+
if (SymbolOrTypeHasAttribute(parameter, parameter.Type, GetSkipValidationAttribute(wellKnownTypes)))
156162
{
157163
continue;
158164
}
@@ -196,7 +202,7 @@ internal ImmutableArray<ValidatableProperty> ExtractValidatableMembers(ITypeSymb
196202
}
197203

198204
// Skip property if it or its type are annotated with SkipValidationAttribute
199-
if (SymbolOrTypeHasAttribute(member, member.Type, skipValidationAttributeSymbol))
205+
if (SymbolOrTypeHasAttribute(member, member.Type, GetSkipValidationAttribute(wellKnownTypes)))
200206
{
201207
continue;
202208
}
@@ -244,6 +250,12 @@ internal static ImmutableArray<ValidationAttribute> ExtractValidationAttributes(
244250
IsCustomValidationAttribute: SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, wellKnownTypes.Get(WellKnownTypeData.WellKnownType.System_ComponentModel_DataAnnotations_CustomValidationAttribute))))];
245251
}
246252

253+
private static INamedTypeSymbol GetSkipValidationAttribute(WellKnownTypes wellKnownTypes)
254+
{
255+
_skipValidationAttribute ??= wellKnownTypes.Get(WellKnownTypeData.WellKnownType.Microsoft_Extensions_Validation_SkipValidationAttribute);
256+
return _skipValidationAttribute;
257+
}
258+
247259
private static bool SymbolOrTypeHasAttribute(ISymbol symbol, ITypeSymbol typeSymbol, INamedTypeSymbol attributeSymbol)
248260
{
249261
return symbol.HasAttribute(attributeSymbol)

src/Validation/src/RuntimeValidatableParameterInfoResolver.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ public bool TryGetValidatableParameterInfo(ParameterInfo parameterInfo, [NotNull
2828
throw new InvalidOperationException($"Encountered a parameter of type '{parameterInfo.ParameterType}' without a name. Parameters must have a name.");
2929
}
3030

31+
// Skip parameter if it is annotated with [SkipValidation] or its type is annotated with [SkipValidation].
32+
if (parameterInfo.GetCustomAttribute<SkipValidationAttribute>() != null ||
33+
parameterInfo.ParameterType.GetCustomAttribute<SkipValidationAttribute>() != null)
34+
{
35+
validatableInfo = null;
36+
return false;
37+
}
38+
3139
var validationAttributes = parameterInfo
3240
.GetCustomAttributes<ValidationAttribute>()
3341
.ToArray();

0 commit comments

Comments
 (0)