Skip to content

Fix handling of implicitly declared EqualityContract on record types in validation generator #62510

Closed
@captainsafia

Description

@captainsafia

When a record class being inspected comes from metadata (i.e., a referenced assembly or a prior incremental step), its compiler-synthesised EqualityContract property is not flagged with IsImplicitlyDeclared == true. The current filter in ExtractValidatableMembers relies solely on that flag, so the property slips through and a GeneratedValidatablePropertyInfo is produced for it:

// Skip compiler-generated properties…
if (member.IsImplicitlyDeclared || resolvedRecordProperty.Contains(member, SymbolEqualityComparer.Default))
{
  continue;
}

As a result of this, every metadata-based record type ends up with a spurious ValidatablePropertyInfo for EqualityContract which the runtime resolver will attempt to apply and fail for.

We need dd a helper that recognizes EqualityContract by its signature, not by IsImplicitlyDeclared, and use it in the skip logic.

private static bool IsEqualityContract(IPropertySymbol prop) =>
  prop.Name ==EqualityContract&& prop.Type.SpecialType == SpecialType.System_Type
  && prop.DeclaredAccessibility == Accessibility.Protected;

Update the member loop:

foreach (var member in typeSymbol.GetMembers().OfType())
{
  if (member.IsImplicitlyDeclared                     
    || IsEqualityContract(member) 
    || resolvedRecordProperty.Contains(member, SymbolEqualityComparer.Default))
    {
      continue;
    }
}

Metadata

Metadata

Assignees

Labels

area-minimalIncludes minimal APIs, endpoint filters, parameter binding, request delegate generator etcfeature-validationIssues related to model validation in minimal and controller-based APIs

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions