11namespace ReflectionAnalyzers
22{
33 using System . Linq ;
4- using System . Threading ;
54 using Gu . Roslyn . AnalyzerExtensions ;
65 using Microsoft . CodeAnalysis ;
76 using Microsoft . CodeAnalysis . CSharp . Syntax ;
@@ -130,26 +129,27 @@ internal static bool TryGetTargetType(InvocationExpressionSyntax getX, SyntaxNod
130129 TryGetTargetType ( memberAccess . Expression , context , null , out result , out instance ) ;
131130 }
132131
133- internal static GetXResult TryGetTarget ( IMethodSymbol getX , ITypeSymbol targetType , string targetName , BindingFlags effectiveFlags , SyntaxNodeAnalysisContext context , out ISymbol target )
132+ internal static GetXResult TryGetTarget ( IMethodSymbol getX , ITypeSymbol targetType , string targetMetadataName , BindingFlags effectiveFlags , SyntaxNodeAnalysisContext context , out ISymbol target )
134133 {
134+ var name = TrimName ( ) ;
135135 target = null ;
136136 if ( targetType is ITypeParameterSymbol typeParameter )
137137 {
138138 if ( typeParameter . ConstraintTypes . Length == 0 )
139139 {
140- return TryGetTarget ( getX , context . Compilation . GetSpecialType ( SpecialType . System_Object ) , targetName , effectiveFlags , context , out target ) ;
140+ return TryGetTarget ( getX , context . Compilation . GetSpecialType ( SpecialType . System_Object ) , name , effectiveFlags , context , out target ) ;
141141 }
142142
143143 foreach ( var constraintType in typeParameter . ConstraintTypes )
144144 {
145- var result = TryGetTarget ( getX , constraintType , targetName , effectiveFlags , context , out target ) ;
145+ var result = TryGetTarget ( getX , constraintType , name , effectiveFlags , context , out target ) ;
146146 if ( result != GetXResult . NoMatch )
147147 {
148148 return result ;
149149 }
150150 }
151151
152- return TryGetTarget ( getX , context . Compilation . GetSpecialType ( SpecialType . System_Object ) , targetName , effectiveFlags , context , out target ) ;
152+ return TryGetTarget ( getX , context . Compilation . GetSpecialType ( SpecialType . System_Object ) , name , effectiveFlags , context , out target ) ;
153153 }
154154
155155 if ( getX == KnownSymbol . Type . GetNestedType ||
@@ -158,9 +158,9 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
158158 ! effectiveFlags . HasFlagFast ( BindingFlags . Instance ) &&
159159 ! effectiveFlags . HasFlagFast ( BindingFlags . FlattenHierarchy ) ) )
160160 {
161- foreach ( var member in targetType . GetMembers ( targetName ) )
161+ foreach ( var member in targetType . GetMembers ( name ) )
162162 {
163- if ( ! MatchesFlags ( member , effectiveFlags ) )
163+ if ( ! MatchesFilter ( member , targetMetadataName , effectiveFlags ) )
164164 {
165165 continue ;
166166 }
@@ -180,7 +180,7 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
180180 return GetXResult . Single ;
181181 }
182182
183- if ( targetType . TryFindFirstMemberRecursive ( targetName , out target ) )
183+ if ( targetType . TryFindFirstMemberRecursive ( name , out target ) )
184184 {
185185 if ( getX == KnownSymbol . Type . GetNestedType &&
186186 ! targetType . Equals ( target . ContainingType ) )
@@ -214,9 +214,9 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
214214 var current = targetType ;
215215 while ( current != null )
216216 {
217- foreach ( var member in current . GetMembers ( targetName ) )
217+ foreach ( var member in current . GetMembers ( name ) )
218218 {
219- if ( ! MatchesFlags ( member , effectiveFlags ) )
219+ if ( ! MatchesFilter ( member , targetMetadataName , effectiveFlags ) )
220220 {
221221 continue ;
222222 }
@@ -258,7 +258,7 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
258258
259259 if ( target == null )
260260 {
261- if ( targetType . TryFindFirstMemberRecursive ( targetName , out target ) )
261+ if ( targetType . TryFindFirstMemberRecursive ( name , out target ) )
262262 {
263263 return GetXResult . WrongFlags ;
264264 }
@@ -332,7 +332,7 @@ bool IsExplicitImplementation( out ISymbol result)
332332 {
333333 foreach ( var @interface in targetType . AllInterfaces )
334334 {
335- if ( @interface . TryFindFirstMemberRecursive ( targetName , out result ) )
335+ if ( @interface . TryFindFirstMemberRecursive ( name , out result ) )
336336 {
337337 return true ;
338338 }
@@ -341,6 +341,17 @@ bool IsExplicitImplementation( out ISymbol result)
341341 result = null ;
342342 return false ;
343343 }
344+
345+ string TrimName ( )
346+ {
347+ var index = targetMetadataName . IndexOf ( '`' ) ;
348+ if ( index > 0 )
349+ {
350+ return targetMetadataName . Substring ( 0 , index ) ;
351+ }
352+
353+ return targetMetadataName ;
354+ }
344355 }
345356
346357 internal static bool TryGetDefaultFlags ( QualifiedMethod getX , out BindingFlags defaultFlags )
@@ -409,8 +420,13 @@ private static bool TryGetFlags(InvocationExpressionSyntax invocation, IMethodSy
409420 context . SemanticModel . TryGetConstantValue ( argument . Expression , context . CancellationToken , out bindingFlags ) ;
410421 }
411422
412- private static bool MatchesFlags ( ISymbol candidate , BindingFlags filter )
423+ private static bool MatchesFilter ( ISymbol candidate , string metadataName , BindingFlags filter )
413424 {
425+ if ( candidate . MetadataName != metadataName )
426+ {
427+ return false ;
428+ }
429+
414430 if ( candidate . DeclaredAccessibility == Accessibility . Public &&
415431 ! filter . HasFlagFast ( BindingFlags . Public ) )
416432 {
@@ -498,7 +514,7 @@ private static bool TryGetTargetType(ExpressionSyntax expression, SyntaxNodeAnal
498514 }
499515
500516 return context . SemanticModel . TryGetType ( typeAccess . Expression , context . CancellationToken , out result ) ;
501- case IdentifierNameSyntax identifierName when expression . TryFirstAncestor ( out TypeDeclarationSyntax containingType ) :
517+ case IdentifierNameSyntax _ when expression . TryFirstAncestor ( out TypeDeclarationSyntax containingType ) :
502518 return context . SemanticModel . TryGetSymbol ( containingType , context . CancellationToken , out result ) ;
503519 }
504520 }
0 commit comments