Skip to content

Commit dc52c1b

Browse files
authored
Merge pull request #209 from equals03/feat/support-record-classes
feat: support registration of record classes
2 parents 6a22603 + f85f057 commit dc52c1b

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

src/Injectio.Generators/ServiceRegistrationGenerator.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)