diff --git a/src/Shared/RoslynUtils/WellKnownTypeData.cs b/src/Shared/RoslynUtils/WellKnownTypeData.cs index f60d17e9e0a8..1afb045fc713 100644 --- a/src/Shared/RoslynUtils/WellKnownTypeData.cs +++ b/src/Shared/RoslynUtils/WellKnownTypeData.cs @@ -123,6 +123,7 @@ public enum WellKnownType System_ComponentModel_DataAnnotations_ValidationAttribute, System_ComponentModel_DataAnnotations_RequiredAttribute, System_ComponentModel_DataAnnotations_CustomValidationAttribute, + System_Type, } public static string[] WellKnownTypeNames = @@ -243,5 +244,6 @@ public enum WellKnownType "System.ComponentModel.DataAnnotations.ValidationAttribute", "System.ComponentModel.DataAnnotations.RequiredAttribute", "System.ComponentModel.DataAnnotations.CustomValidationAttribute", + "System.Type", ]; } diff --git a/src/Validation/gen/Extensions/ISymbolExtensions.cs b/src/Validation/gen/Extensions/ISymbolExtensions.cs index b1b0a35a7b03..a770b7260656 100644 --- a/src/Validation/gen/Extensions/ISymbolExtensions.cs +++ b/src/Validation/gen/Extensions/ISymbolExtensions.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using Microsoft.AspNetCore.App.Analyzers.Infrastructure; using Microsoft.CodeAnalysis; namespace Microsoft.Extensions.Validation; @@ -32,4 +33,9 @@ attribute.AttributeClass is { } attributeClass && return property.Name; } + + public static bool IsEqualityContract(this IPropertySymbol prop, WellKnownTypes wellKnownTypes) => + prop.Name == "EqualityContract" + && SymbolEqualityComparer.Default.Equals(prop.Type, wellKnownTypes.Get(WellKnownTypeData.WellKnownType.System_Type)) + && prop.DeclaredAccessibility == Accessibility.Protected; } diff --git a/src/Validation/gen/Parsers/ValidationsGenerator.TypesParser.cs b/src/Validation/gen/Parsers/ValidationsGenerator.TypesParser.cs index 1ee0722694f4..c7155b8c049b 100644 --- a/src/Validation/gen/Parsers/ValidationsGenerator.TypesParser.cs +++ b/src/Validation/gen/Parsers/ValidationsGenerator.TypesParser.cs @@ -162,7 +162,9 @@ internal ImmutableArray ExtractValidatableMembers(ITypeSymb { // Skip compiler generated properties and properties already processed via // the record processing logic above. - if (member.IsImplicitlyDeclared || resolvedRecordProperty.Contains(member, SymbolEqualityComparer.Default)) + if (member.IsImplicitlyDeclared + || member.IsEqualityContract(wellKnownTypes) + || resolvedRecordProperty.Contains(member, SymbolEqualityComparer.Default)) { continue; }