@@ -10,7 +10,7 @@ namespace ServiceScan.SourceGenerator;
1010
1111public partial class DependencyInjectionGenerator
1212{
13- private static IEnumerable < ( INamedTypeSymbol Type , INamedTypeSymbol ? MatchedAssignableType ) > FilterTypes
13+ private static IEnumerable < ( INamedTypeSymbol Type , INamedTypeSymbol [ ] ? MatchedAssignableTypes ) > FilterTypes
1414 ( Compilation compilation , AttributeModel attribute , INamedTypeSymbol containingType )
1515 {
1616 var assemblies = GetAssembliesToScan ( compilation , attribute , containingType ) ;
@@ -72,37 +72,39 @@ public partial class DependencyInjectionGenerator
7272 if ( excludeAssignableToType != null && IsAssignableTo ( type , excludeAssignableToType , out _ ) )
7373 continue ;
7474
75- INamedTypeSymbol matchedType = null ;
76- if ( assignableToType != null && ! IsAssignableTo ( type , assignableToType , out matchedType ) )
75+ INamedTypeSymbol [ ] matchedTypes = null ;
76+ if ( assignableToType != null && ! IsAssignableTo ( type , assignableToType , out matchedTypes ) )
7777 continue ;
7878
79- yield return ( type , matchedType ) ;
79+ yield return ( type , matchedTypes ) ;
8080 }
8181 }
8282
83- private static bool IsAssignableTo ( INamedTypeSymbol type , INamedTypeSymbol assignableTo , out INamedTypeSymbol ? matchedType )
83+ private static bool IsAssignableTo ( INamedTypeSymbol type , INamedTypeSymbol assignableTo , out INamedTypeSymbol [ ] ? matchedTypes )
8484 {
8585 if ( SymbolEqualityComparer . Default . Equals ( type , assignableTo ) )
8686 {
87- matchedType = type ;
87+ matchedTypes = [ type] ;
8888 return true;
8989 }
9090
9191 if ( assignableTo . IsGenericType && assignableTo . IsDefinition )
9292 {
9393 if ( assignableTo . TypeKind == TypeKind . Interface )
9494 {
95- var matchingInterface = type . AllInterfaces . FirstOrDefault ( i => i . IsGenericType && SymbolEqualityComparer . Default . Equals ( i . OriginalDefinition , assignableTo ) ) ;
96- matchedType = matchingInterface ;
97- return matchingInterface != null ;
95+ matchedTypes = type . AllInterfaces
96+ . Where ( i => i . IsGenericType && SymbolEqualityComparer . Default . Equals ( i . OriginalDefinition , assignableTo ) )
97+ . ToArray ( ) ;
98+
99+ return matchedTypes. Length > 0 ;
98100 }
99101
100102 var baseType = type . BaseType ;
101103 while ( baseType != null )
102104 {
103105 if ( baseType . IsGenericType && SymbolEqualityComparer . Default . Equals ( baseType . OriginalDefinition , assignableTo ) )
104106 {
105- matchedType = baseType ;
107+ matchedTypes = [ baseType ] ;
106108 return true;
107109 }
108110
@@ -113,7 +115,7 @@ private static bool IsAssignableTo(INamedTypeSymbol type, INamedTypeSymbol assig
113115 {
114116 if ( assignableTo . TypeKind == TypeKind . Interface )
115117 {
116- matchedType = assignableTo ;
118+ matchedTypes = [ assignableTo ] ;
117119 return type . AllInterfaces . Contains ( assignableTo , SymbolEqualityComparer . Default ) ;
118120 }
119121
@@ -122,15 +124,15 @@ private static bool IsAssignableTo(INamedTypeSymbol type, INamedTypeSymbol assig
122124 {
123125 if ( SymbolEqualityComparer . Default . Equals ( baseType , assignableTo ) )
124126 {
125- matchedType = baseType ;
127+ matchedTypes = [ baseType ] ;
126128 return true ;
127129 }
128130
129131 baseType = baseType . BaseType ;
130132 }
131133 }
132134
133- matchedType = null ;
135+ matchedTypes = null ;
134136 return false ;
135137 }
136138
0 commit comments