@@ -258,9 +258,9 @@ private void AnalyzeFieldDependencies(CodeElement fieldElement, IFieldSymbol fie
258
258
/// <summary>
259
259
/// For method and property bodies.
260
260
/// </summary>
261
- private void AnalyzeMethodBody ( CodeElement methodElement , SyntaxNode node , SemanticModel semanticModel )
261
+ private void AnalyzeMethodBody ( CodeElement sourceElement , SyntaxNode node , SemanticModel semanticModel )
262
262
{
263
- foreach ( var descendantNode in node . DescendantNodes ( ) )
263
+ foreach ( var descendantNode in node . DescendantNodesAndSelf ( ) )
264
264
{
265
265
switch ( descendantNode )
266
266
{
@@ -269,29 +269,44 @@ private void AnalyzeMethodBody(CodeElement methodElement, SyntaxNode node, Seman
269
269
if ( typeInfo . Type != null )
270
270
{
271
271
var location = GetLocation ( objectCreationSyntax ) ;
272
- AddTypeDependency ( methodElement , typeInfo . Type , DependencyType . Creates , location ) ;
272
+ AddTypeDependency ( sourceElement , typeInfo . Type , DependencyType . Creates , location ) ;
273
273
}
274
274
275
275
break ;
276
276
277
-
278
277
case InvocationExpressionSyntax invocationSyntax :
279
278
var symbolInfo = semanticModel . GetSymbolInfo ( invocationSyntax ) ;
280
279
if ( symbolInfo . Symbol is IMethodSymbol calledMethod )
281
280
{
282
281
var location = GetLocation ( invocationSyntax ) ;
283
- AddCallsDependency ( methodElement , calledMethod , location ) ;
282
+ AddCallsDependency ( sourceElement , calledMethod , location ) ;
283
+
284
+ // Handle generic method invocations
285
+ if ( calledMethod . IsGenericMethod )
286
+ {
287
+ foreach ( var typeArg in calledMethod . TypeArguments )
288
+ {
289
+ AddTypeDependency ( sourceElement , typeArg , DependencyType . Uses , location ) ;
290
+ }
291
+ }
292
+ }
293
+
294
+ // Handle event invocations
295
+ var invokedSymbol = semanticModel . GetSymbolInfo ( invocationSyntax . Expression ) . Symbol ;
296
+ if ( invokedSymbol is IMethodSymbol { AssociatedSymbol : IEventSymbol eventSymbol2 } )
297
+ {
298
+ // Capture cases where an event is directly invoked
299
+ AddEventUsageDependency ( sourceElement , eventSymbol2 ) ;
284
300
}
285
301
286
302
break ;
287
303
288
304
case IdentifierNameSyntax identifierSyntax :
289
- AnalyzeIdentifier ( methodElement , identifierSyntax , semanticModel ) ;
305
+ AnalyzeIdentifier ( sourceElement , identifierSyntax , semanticModel ) ;
290
306
break ;
291
307
292
308
case MemberAccessExpressionSyntax memberAccessSyntax :
293
- // Accessing properties.
294
- AnalyzeMemberAccess ( methodElement , memberAccessSyntax , semanticModel ) ;
309
+ AnalyzeMemberAccess ( sourceElement , memberAccessSyntax , semanticModel ) ;
295
310
break ;
296
311
297
312
case AssignmentExpressionSyntax assignmentExpression :
@@ -303,7 +318,7 @@ private void AnalyzeMethodBody(CodeElement methodElement, SyntaxNode node, Seman
303
318
var leftSymbol = semanticModel . GetSymbolInfo ( assignmentExpression . Left ) . Symbol ;
304
319
if ( leftSymbol is IEventSymbol eventSymbol )
305
320
{
306
- AddEventUsageDependency ( methodElement , eventSymbol ) ;
321
+ AddEventUsageDependency ( sourceElement , eventSymbol ) ;
307
322
}
308
323
}
309
324
@@ -437,59 +452,6 @@ private void AddTypeDependency(CodeElement sourceElement, ITypeSymbol typeSymbol
437
452
}
438
453
}
439
454
440
- // Optional method to track external dependencies if needed
441
- private void AddExternalDependency ( CodeElement sourceElement , ITypeSymbol typeSymbol , DependencyType dependencyType ,
442
- SourceLocation ? location )
443
- {
444
- // Implement if you want to track external dependencies
445
- // This could involve creating a special CodeElement for external types
446
- // or simply logging the dependency information
447
- }
448
-
449
- private void AnalyzeExpressionBody ( CodeElement sourceElement , ArrowExpressionClauseSyntax expressionBody ,
450
- SemanticModel semanticModel )
451
- {
452
- // TODO atr. Can we just call AnalyzeMethodBody?
453
- // The InvocationExpressionSyntax handles more cases here. But all other methods are also handled in AnalyzeMethodBody
454
- AnalyzeExpression ( sourceElement , expressionBody . Expression , semanticModel ) ;
455
- }
456
-
457
- private void AnalyzeExpression ( CodeElement sourceElement , ExpressionSyntax expression , SemanticModel semanticModel )
458
- {
459
- foreach ( var node in expression . DescendantNodesAndSelf ( ) )
460
- {
461
- switch ( node )
462
- {
463
- case IdentifierNameSyntax identifierSyntax :
464
- AnalyzeIdentifier ( sourceElement , identifierSyntax , semanticModel ) ;
465
- break ;
466
- case MemberAccessExpressionSyntax memberAccessSyntax :
467
- AnalyzeMemberAccess ( sourceElement , memberAccessSyntax , semanticModel ) ;
468
- break ;
469
- case InvocationExpressionSyntax invocationSyntax :
470
-
471
- var invokedSymbol = semanticModel . GetSymbolInfo ( invocationSyntax . Expression ) . Symbol ;
472
- if ( invokedSymbol is IMethodSymbol { AssociatedSymbol : IEventSymbol eventSymbol } )
473
- {
474
- // Capture cases where an event is directly invoked
475
- AddEventUsageDependency ( sourceElement , eventSymbol ) ;
476
- }
477
-
478
- var symbolInfo = semanticModel . GetSymbolInfo ( invocationSyntax ) ;
479
- if ( symbolInfo . Symbol is IMethodSymbol calledMethod )
480
- {
481
- var location = GetLocation ( invocationSyntax ) ;
482
- AddCallsDependency ( sourceElement , calledMethod , location ) ;
483
- }
484
-
485
- break ;
486
-
487
-
488
- // Add more cases as needed
489
- }
490
- }
491
- }
492
-
493
455
private void AnalyzeIdentifier ( CodeElement sourceElement , IdentifierNameSyntax identifierSyntax ,
494
456
SemanticModel semanticModel )
495
457
{
0 commit comments