Skip to content

Commit e88ba97

Browse files
committed
Handling for generic methods
- Combined expression body and method body handling
1 parent 9ebf24c commit e88ba97

File tree

2 files changed

+26
-65
lines changed

2 files changed

+26
-65
lines changed

CodeParser/Parser/Parser.Phase2.Properties.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,15 @@ private void AnalyzePropertyBody(Solution solution, CodeElement propertyElement,
5353
{
5454
if (propertyDeclaration.ExpressionBody != null)
5555
{
56-
AnalyzeExpressionBody(propertyElement, propertyDeclaration.ExpressionBody, semanticModel);
56+
AnalyzeMethodBody(propertyElement, propertyDeclaration.ExpressionBody.Expression, semanticModel);
5757
}
5858
else if (propertyDeclaration.AccessorList != null)
5959
{
6060
foreach (var accessor in propertyDeclaration.AccessorList.Accessors)
6161
{
6262
if (accessor.ExpressionBody != null)
6363
{
64-
AnalyzeExpressionBody(propertyElement, accessor.ExpressionBody, semanticModel);
64+
AnalyzeMethodBody(propertyElement, accessor.ExpressionBody.Expression, semanticModel);
6565
}
6666
else if (accessor.Body != null)
6767
{
@@ -73,7 +73,6 @@ private void AnalyzePropertyBody(Solution solution, CodeElement propertyElement,
7373
}
7474
}
7575
}
76-
7776
private void AddPropertyDependency(CodeElement sourceElement, IPropertySymbol propertySymbol,
7877
DependencyType dependencyType, List<SourceLocation> locations)
7978
{

CodeParser/Parser/Parser.Phase2.cs

Lines changed: 24 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,9 @@ private void AnalyzeFieldDependencies(CodeElement fieldElement, IFieldSymbol fie
258258
/// <summary>
259259
/// For method and property bodies.
260260
/// </summary>
261-
private void AnalyzeMethodBody(CodeElement methodElement, SyntaxNode node, SemanticModel semanticModel)
261+
private void AnalyzeMethodBody(CodeElement sourceElement, SyntaxNode node, SemanticModel semanticModel)
262262
{
263-
foreach (var descendantNode in node.DescendantNodes())
263+
foreach (var descendantNode in node.DescendantNodesAndSelf())
264264
{
265265
switch (descendantNode)
266266
{
@@ -269,29 +269,44 @@ private void AnalyzeMethodBody(CodeElement methodElement, SyntaxNode node, Seman
269269
if (typeInfo.Type != null)
270270
{
271271
var location = GetLocation(objectCreationSyntax);
272-
AddTypeDependency(methodElement, typeInfo.Type, DependencyType.Creates, location);
272+
AddTypeDependency(sourceElement, typeInfo.Type, DependencyType.Creates, location);
273273
}
274274

275275
break;
276276

277-
278277
case InvocationExpressionSyntax invocationSyntax:
279278
var symbolInfo = semanticModel.GetSymbolInfo(invocationSyntax);
280279
if (symbolInfo.Symbol is IMethodSymbol calledMethod)
281280
{
282281
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);
284300
}
285301

286302
break;
287303

288304
case IdentifierNameSyntax identifierSyntax:
289-
AnalyzeIdentifier(methodElement, identifierSyntax, semanticModel);
305+
AnalyzeIdentifier(sourceElement, identifierSyntax, semanticModel);
290306
break;
291307

292308
case MemberAccessExpressionSyntax memberAccessSyntax:
293-
// Accessing properties.
294-
AnalyzeMemberAccess(methodElement, memberAccessSyntax, semanticModel);
309+
AnalyzeMemberAccess(sourceElement, memberAccessSyntax, semanticModel);
295310
break;
296311

297312
case AssignmentExpressionSyntax assignmentExpression:
@@ -303,7 +318,7 @@ private void AnalyzeMethodBody(CodeElement methodElement, SyntaxNode node, Seman
303318
var leftSymbol = semanticModel.GetSymbolInfo(assignmentExpression.Left).Symbol;
304319
if (leftSymbol is IEventSymbol eventSymbol)
305320
{
306-
AddEventUsageDependency(methodElement, eventSymbol);
321+
AddEventUsageDependency(sourceElement, eventSymbol);
307322
}
308323
}
309324

@@ -437,59 +452,6 @@ private void AddTypeDependency(CodeElement sourceElement, ITypeSymbol typeSymbol
437452
}
438453
}
439454

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-
493455
private void AnalyzeIdentifier(CodeElement sourceElement, IdentifierNameSyntax identifierSyntax,
494456
SemanticModel semanticModel)
495457
{

0 commit comments

Comments
 (0)