@@ -143,38 +143,38 @@ internal static bool TryGetTargetType(InvocationExpressionSyntax getX, SyntaxNod
143143 TryGetTargetType ( memberAccess . Expression , context , null , out result , out instance ) ;
144144 }
145145
146- internal static GetXResult TryGetTarget ( IMethodSymbol getX , ITypeSymbol targetType , string targetMetadataName , BindingFlags effectiveFlags , IReadOnlyList < ITypeSymbol > types , SyntaxNodeAnalysisContext context , out ISymbol target )
146+ internal static GetXResult TryGetTarget ( IMethodSymbol getX , ITypeSymbol targetType , string targetMetadataName , BindingFlags flags , IReadOnlyList < ITypeSymbol > types , SyntaxNodeAnalysisContext context , out ISymbol target )
147147 {
148148 var name = TrimName ( ) ;
149149 target = null ;
150150 if ( targetType is ITypeParameterSymbol typeParameter )
151151 {
152152 if ( typeParameter . ConstraintTypes . Length == 0 )
153153 {
154- return TryGetTarget ( getX , context . Compilation . GetSpecialType ( SpecialType . System_Object ) , name , effectiveFlags , types , context , out target ) ;
154+ return TryGetTarget ( getX , context . Compilation . GetSpecialType ( SpecialType . System_Object ) , name , flags , types , context , out target ) ;
155155 }
156156
157157 foreach ( var constraintType in typeParameter . ConstraintTypes )
158158 {
159- var result = TryGetTarget ( getX , constraintType , name , effectiveFlags , types , context , out target ) ;
159+ var result = TryGetTarget ( getX , constraintType , name , flags , types , context , out target ) ;
160160 if ( result != GetXResult . NoMatch )
161161 {
162162 return result ;
163163 }
164164 }
165165
166- return TryGetTarget ( getX , context . Compilation . GetSpecialType ( SpecialType . System_Object ) , name , effectiveFlags , types , context , out target ) ;
166+ return TryGetTarget ( getX , context . Compilation . GetSpecialType ( SpecialType . System_Object ) , name , flags , types , context , out target ) ;
167167 }
168168
169169 if ( getX == KnownSymbol . Type . GetNestedType ||
170- effectiveFlags . HasFlagFast ( BindingFlags . DeclaredOnly ) ||
171- ( effectiveFlags . HasFlagFast ( BindingFlags . Static ) &&
172- ! effectiveFlags . HasFlagFast ( BindingFlags . Instance ) &&
173- ! effectiveFlags . HasFlagFast ( BindingFlags . FlattenHierarchy ) ) )
170+ flags . HasFlagFast ( BindingFlags . DeclaredOnly ) ||
171+ ( flags . HasFlagFast ( BindingFlags . Static ) &&
172+ ! flags . HasFlagFast ( BindingFlags . Instance ) &&
173+ ! flags . HasFlagFast ( BindingFlags . FlattenHierarchy ) ) )
174174 {
175175 foreach ( var member in targetType . GetMembers ( name ) )
176176 {
177- if ( ! MatchesFilter ( member , targetMetadataName , effectiveFlags , types ) )
177+ if ( ! MatchesFilter ( member , targetMetadataName , flags , types ) )
178178 {
179179 continue ;
180180 }
@@ -209,15 +209,27 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
209209 return GetXResult . UseContainingType ;
210210 }
211211
212- return GetXResult . WrongFlags ;
212+ if ( target . MetadataName == targetMetadataName &&
213+ ! MatchesFilter ( target , target . MetadataName , flags , null ) )
214+ {
215+ return GetXResult . WrongFlags ;
216+ }
217+
218+ if ( ! target . ContainingType . Equals ( targetType ) &&
219+ ( target . IsStatic ||
220+ flags . HasFlagFast ( BindingFlags . DeclaredOnly ) ) )
221+ {
222+ return GetXResult . WrongFlags ;
223+ }
213224 }
214225
215226 if ( IsExplicitImplementation ( out target ) )
216227 {
217228 return GetXResult . ExplicitImplementation ;
218229 }
219230
220- if ( ! HasVisibleMembers ( targetType , effectiveFlags ) )
231+ if ( flags . HasFlagFast ( BindingFlags . NonPublic ) &&
232+ ! targetType . Locations . Any ( x => x . IsInSource ) )
221233 {
222234 return GetXResult . Unknown ;
223235 }
@@ -230,14 +242,7 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
230242 {
231243 foreach ( var member in current . GetMembers ( name ) )
232244 {
233- if ( ! MatchesFilter ( member , targetMetadataName , effectiveFlags , types ) )
234- {
235- continue ;
236- }
237-
238- if ( member . IsStatic &&
239- ! current . Equals ( targetType ) &&
240- ! effectiveFlags . HasFlagFast ( BindingFlags . FlattenHierarchy ) )
245+ if ( ! MatchesFilter ( member , targetMetadataName , flags , types ) )
241246 {
242247 continue ;
243248 }
@@ -252,6 +257,13 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
252257 return GetXResult . UseContainingType ;
253258 }
254259
260+ if ( member . IsStatic &&
261+ ! current . Equals ( targetType ) &&
262+ ! flags . HasFlagFast ( BindingFlags . FlattenHierarchy ) )
263+ {
264+ return GetXResult . WrongFlags ;
265+ }
266+
255267 if ( IsOfWrongType ( member ) )
256268 {
257269 return GetXResult . WrongMemberType ;
@@ -274,15 +286,19 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
274286 {
275287 if ( targetType . TryFindFirstMemberRecursive ( name , out target ) )
276288 {
277- return GetXResult . WrongFlags ;
289+ if ( target . MetadataName == targetMetadataName &&
290+ ! MatchesFilter ( target , target . MetadataName , flags , null ) )
291+ {
292+ return GetXResult . WrongFlags ;
293+ }
278294 }
279295
280296 if ( IsExplicitImplementation ( out target ) )
281297 {
282298 return GetXResult . ExplicitImplementation ;
283299 }
284300
285- if ( ! HasVisibleMembers ( targetType , effectiveFlags ) )
301+ if ( ! HasVisibleMembers ( targetType , flags ) )
286302 {
287303 return GetXResult . Unknown ;
288304 }
0 commit comments