Skip to content

Commit 7b74200

Browse files
committed
C#: The call to an extension operator should be considered an operator invocation.
1 parent 359934c commit 7b74200

File tree

1 file changed

+29
-10
lines changed
  • csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions

1 file changed

+29
-10
lines changed

csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Invocation.cs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ private Invocation(ExpressionNodeInfo info)
2424

2525
private bool IsExplicitDelegateInvokeCall() => Kind == ExprKind.DELEGATE_INVOCATION && Context.GetModel(Syntax.Expression).GetSymbolInfo(Syntax.Expression).Symbol is IMethodSymbol m && m.MethodKind == MethodKind.DelegateInvoke;
2626

27+
private bool IsOperatorCall() => Kind == ExprKind.OPERATOR_INVOCATION;
28+
2729
protected override void PopulateExpression(TextWriter trapFile)
2830
{
2931
if (IsNameof(Syntax))
@@ -37,7 +39,7 @@ protected override void PopulateExpression(TextWriter trapFile)
3739
var target = TargetSymbol;
3840
switch (Syntax.Expression)
3941
{
40-
case MemberAccessExpressionSyntax memberAccess when Kind == ExprKind.METHOD_INVOCATION || IsEventDelegateCall() || IsExplicitDelegateInvokeCall():
42+
case MemberAccessExpressionSyntax memberAccess when Kind == ExprKind.METHOD_INVOCATION || IsEventDelegateCall() || IsExplicitDelegateInvokeCall() || IsOperatorCall():
4143
memberName = memberAccess.Name.Identifier.Text;
4244
if (Syntax.Expression.Kind() == SyntaxKind.SimpleMemberAccessExpression)
4345
// Qualified method call; `x.M()`
@@ -113,6 +115,13 @@ private static bool IsDynamicCall(ExpressionNodeInfo info)
113115

114116
public SymbolInfo SymbolInfo => info.SymbolInfo;
115117

118+
private static bool IsOperatorLikeCall(ExpressionNodeInfo info)
119+
{
120+
return info.SymbolInfo.Symbol is IMethodSymbol method &&
121+
method.TryGetExtensionMethod(out var original) &&
122+
original!.MethodKind == MethodKind.UserDefinedOperator;
123+
}
124+
116125
public IMethodSymbol? TargetSymbol
117126
{
118127
get
@@ -206,15 +215,25 @@ private static bool IsLocalFunctionInvocation(ExpressionNodeInfo info)
206215

207216
private static ExprKind GetKind(ExpressionNodeInfo info)
208217
{
209-
return IsNameof((InvocationExpressionSyntax)info.Node)
210-
? ExprKind.NAMEOF
211-
: IsDelegateLikeCall(info)
212-
? IsDelegateInvokeCall(info)
213-
? ExprKind.DELEGATE_INVOCATION
214-
: ExprKind.FUNCTION_POINTER_INVOCATION
215-
: IsLocalFunctionInvocation(info)
216-
? ExprKind.LOCAL_FUNCTION_INVOCATION
217-
: ExprKind.METHOD_INVOCATION;
218+
if (IsNameof((InvocationExpressionSyntax)info.Node))
219+
{
220+
return ExprKind.NAMEOF;
221+
}
222+
if (IsDelegateLikeCall(info))
223+
{
224+
return IsDelegateInvokeCall(info)
225+
? ExprKind.DELEGATE_INVOCATION
226+
: ExprKind.FUNCTION_POINTER_INVOCATION;
227+
}
228+
if (IsLocalFunctionInvocation(info))
229+
{
230+
return ExprKind.LOCAL_FUNCTION_INVOCATION;
231+
}
232+
if (IsOperatorLikeCall(info))
233+
{
234+
return ExprKind.OPERATOR_INVOCATION;
235+
}
236+
return ExprKind.METHOD_INVOCATION;
218237
}
219238

220239
private static bool IsNameof(InvocationExpressionSyntax syntax)

0 commit comments

Comments
 (0)