@@ -143,38 +143,38 @@ internal static bool TryGetTargetType(InvocationExpressionSyntax getX, SyntaxNod
143
143
TryGetTargetType ( memberAccess . Expression , context , null , out result , out instance ) ;
144
144
}
145
145
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 )
147
147
{
148
148
var name = TrimName ( ) ;
149
149
target = null ;
150
150
if ( targetType is ITypeParameterSymbol typeParameter )
151
151
{
152
152
if ( typeParameter . ConstraintTypes . Length == 0 )
153
153
{
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 ) ;
155
155
}
156
156
157
157
foreach ( var constraintType in typeParameter . ConstraintTypes )
158
158
{
159
- var result = TryGetTarget ( getX , constraintType , name , effectiveFlags , types , context , out target ) ;
159
+ var result = TryGetTarget ( getX , constraintType , name , flags , types , context , out target ) ;
160
160
if ( result != GetXResult . NoMatch )
161
161
{
162
162
return result ;
163
163
}
164
164
}
165
165
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 ) ;
167
167
}
168
168
169
169
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 ) ) )
174
174
{
175
175
foreach ( var member in targetType . GetMembers ( name ) )
176
176
{
177
- if ( ! MatchesFilter ( member , targetMetadataName , effectiveFlags , types ) )
177
+ if ( ! MatchesFilter ( member , targetMetadataName , flags , types ) )
178
178
{
179
179
continue ;
180
180
}
@@ -209,15 +209,27 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
209
209
return GetXResult . UseContainingType ;
210
210
}
211
211
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
+ }
213
224
}
214
225
215
226
if ( IsExplicitImplementation ( out target ) )
216
227
{
217
228
return GetXResult . ExplicitImplementation ;
218
229
}
219
230
220
- if ( ! HasVisibleMembers ( targetType , effectiveFlags ) )
231
+ if ( flags . HasFlagFast ( BindingFlags . NonPublic ) &&
232
+ ! targetType . Locations . Any ( x => x . IsInSource ) )
221
233
{
222
234
return GetXResult . Unknown ;
223
235
}
@@ -230,14 +242,7 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
230
242
{
231
243
foreach ( var member in current . GetMembers ( name ) )
232
244
{
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 ) )
241
246
{
242
247
continue ;
243
248
}
@@ -252,6 +257,13 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
252
257
return GetXResult . UseContainingType ;
253
258
}
254
259
260
+ if ( member . IsStatic &&
261
+ ! current . Equals ( targetType ) &&
262
+ ! flags . HasFlagFast ( BindingFlags . FlattenHierarchy ) )
263
+ {
264
+ return GetXResult . WrongFlags ;
265
+ }
266
+
255
267
if ( IsOfWrongType ( member ) )
256
268
{
257
269
return GetXResult . WrongMemberType ;
@@ -274,15 +286,19 @@ internal static GetXResult TryGetTarget(IMethodSymbol getX, ITypeSymbol targetTy
274
286
{
275
287
if ( targetType . TryFindFirstMemberRecursive ( name , out target ) )
276
288
{
277
- return GetXResult . WrongFlags ;
289
+ if ( target . MetadataName == targetMetadataName &&
290
+ ! MatchesFilter ( target , target . MetadataName , flags , null ) )
291
+ {
292
+ return GetXResult . WrongFlags ;
293
+ }
278
294
}
279
295
280
296
if ( IsExplicitImplementation ( out target ) )
281
297
{
282
298
return GetXResult . ExplicitImplementation ;
283
299
}
284
300
285
- if ( ! HasVisibleMembers ( targetType , effectiveFlags ) )
301
+ if ( ! HasVisibleMembers ( targetType , flags ) )
286
302
{
287
303
return GetXResult . Unknown ;
288
304
}
0 commit comments