C#: Fix extraction of qualified delegate calls

This commit is contained in:
Tom Hvitved
2024-01-31 11:20:02 +01:00
parent c21bf5d82c
commit c74bc68287
3 changed files with 12 additions and 6 deletions

View File

@@ -20,6 +20,10 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
public static Expression Create(ExpressionNodeInfo info) => new Invocation(info).TryPopulate();
private bool IsEventDelegateCall() => Kind == ExprKind.DELEGATE_INVOCATION && Context.GetModel(Syntax.Expression).GetSymbolInfo(Syntax.Expression).Symbol?.Kind == SymbolKind.Event;
private bool IsExplicitDelegateInvokeCall() => Kind == ExprKind.DELEGATE_INVOCATION && Context.GetModel(Syntax.Expression).GetSymbolInfo(Syntax.Expression).Symbol is IMethodSymbol m && m.MethodKind == MethodKind.DelegateInvoke;
protected override void PopulateExpression(TextWriter trapFile)
{
if (IsNameof(Syntax))
@@ -33,7 +37,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
var target = TargetSymbol;
switch (Syntax.Expression)
{
case MemberAccessExpressionSyntax memberAccess:
case MemberAccessExpressionSyntax memberAccess when Kind == ExprKind.METHOD_INVOCATION || IsEventDelegateCall() || IsExplicitDelegateInvokeCall():
memberName = memberAccess.Name.Identifier.Text;
if (Syntax.Expression.Kind() == SyntaxKind.SimpleMemberAccessExpression)
// Qualified method call; `x.M()`
@@ -48,7 +52,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
Create(Context, FindConditionalQualifier(memberBinding), this, child++);
MakeConditional(trapFile);
break;
case SimpleNameSyntax simpleName when (Kind == ExprKind.METHOD_INVOCATION):
case SimpleNameSyntax simpleName when Kind == ExprKind.METHOD_INVOCATION:
// Unqualified method call; `M()`
memberName = simpleName.Identifier.Text;
if (target is not null && !target.IsStatic)