@@ -101,18 +101,29 @@ private static void ReportDiagnostic(SourceProductionContext context, EquatableA
101101
102102 private static bool SyntacticPredicate ( SyntaxNode syntaxNode , CancellationToken cancellationToken )
103103 {
104- return ( syntaxNode is ClassDeclarationSyntax { AttributeLists . Count : > 0 } classDeclaration
105- && ! classDeclaration . Modifiers . Any ( SyntaxKind . AbstractKeyword )
106- && ! classDeclaration . Modifiers . Any ( SyntaxKind . StaticKeyword ) )
107- || ( syntaxNode is MemberDeclarationSyntax { AttributeLists . Count : > 0 } memberDeclaration
108- && ! memberDeclaration . Modifiers . Any ( SyntaxKind . AbstractKeyword ) ) ;
104+ return syntaxNode switch
105+ {
106+ ClassDeclarationSyntax { AttributeLists . Count : > 0 } declaration =>
107+ ! declaration . Modifiers . Any ( SyntaxKind . AbstractKeyword )
108+ && ! declaration . Modifiers . Any ( SyntaxKind . StaticKeyword ) ,
109+
110+ RecordDeclarationSyntax { AttributeLists . Count : > 0 } declaration =>
111+ ! declaration . Modifiers . Any ( SyntaxKind . AbstractKeyword )
112+ && ! declaration . Modifiers . Any ( SyntaxKind . StaticKeyword ) ,
113+
114+ MemberDeclarationSyntax { AttributeLists . Count : > 0 } declaration =>
115+ ! declaration . Modifiers . Any ( SyntaxKind . AbstractKeyword ) ,
116+
117+ _ => false ,
118+ } ;
109119 }
110120
111121 private static ServiceRegistrationContext ? SemanticTransform ( GeneratorSyntaxContext context , CancellationToken cancellationToken )
112122 {
113123 return context . Node switch
114124 {
115125 ClassDeclarationSyntax => SemanticTransformClass ( context ) ,
126+ RecordDeclarationSyntax => SemanticTransformClass ( context ) ,
116127 MethodDeclarationSyntax => SemanticTransformMethod ( context ) ,
117128 _ => null
118129 } ;
@@ -150,10 +161,10 @@ private static bool SyntacticPredicate(SyntaxNode syntaxNode, CancellationToken
150161
151162 private static ServiceRegistrationContext ? SemanticTransformClass ( GeneratorSyntaxContext context )
152163 {
153- if ( context . Node is not ClassDeclarationSyntax classSyntax )
164+ if ( context . Node is not ( TypeDeclarationSyntax declaration and ( ClassDeclarationSyntax or RecordDeclarationSyntax ) ) )
154165 return null ;
155166
156- var classSymbol = context . SemanticModel . GetDeclaredSymbol ( classSyntax ) ;
167+ var classSymbol = context . SemanticModel . GetDeclaredSymbol ( declaration ) ;
157168 if ( classSymbol is null )
158169 return null ;
159170
@@ -332,6 +343,8 @@ private static (EquatableArray<Diagnostic> diagnostics, bool hasServiceCollectio
332343 {
333344 foreach ( var implementedInterface in classSymbol . AllInterfaces )
334345 {
346+ // This interface is typically not injected into services and, more specifically, record types auto-implement it.
347+ if ( implementedInterface . ConstructedFrom . ToString ( ) == "System.IEquatable<T>" ) continue ;
335348 var interfaceName = implementedInterface . ToDisplayString ( _fullyQualifiedNullableFormat ) ;
336349 serviceTypes . Add ( interfaceName ) ;
337350 }
0 commit comments