Skip to content

Commit 99b7bc3

Browse files
committed
C#: Implement extractor support for unsigned right shift.
1 parent 14c92e6 commit 99b7bc3

File tree

5 files changed

+15
-6
lines changed

5 files changed

+15
-6
lines changed

csharp/extractor/Semmle.Extraction.CSharp/Entities/Expression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ public void OperatorCall(TextWriter trapFile, ExpressionSyntax node)
240240
var callType = GetCallType(Context, node);
241241
if (callType == CallType.Dynamic)
242242
{
243-
UserOperator.OperatorSymbol(method.Name, out var operatorName);
243+
UserOperator.TryGetOperatorSymbol(method.Name, out var operatorName);
244244
trapFile.dynamic_member_name(this, operatorName);
245245
return;
246246
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ private static ExprKind GetAssignmentOperation(Context cx, AssignmentExpressionS
7171
return ExprKind.ASSIGN_LSHIFT;
7272
case SyntaxKind.GreaterThanGreaterThanEqualsToken:
7373
return ExprKind.ASSIGN_RSHIFT;
74+
case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:
75+
return ExprKind.ASSIGN_URSHIFT;
7476
case SyntaxKind.QuestionQuestionEqualsToken:
7577
return ExprKind.ASSIGN_COALESCE;
7678
default:
@@ -141,6 +143,8 @@ private ExprKind? OperatorKind
141143
return ExprKind.REM;
142144
case ExprKind.ASSIGN_RSHIFT:
143145
return ExprKind.RSHIFT;
146+
case ExprKind.ASSIGN_URSHIFT:
147+
return ExprKind.URSHIFT;
144148
case ExprKind.ASSIGN_SUB:
145149
return ExprKind.SUB;
146150
case ExprKind.ASSIGN_XOR:

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ private static ExprKind GetBinaryTokenKind(Context cx, BinaryExpressionSyntax no
5050
case SyntaxKind.BarBarToken: return ExprKind.LOG_OR;
5151
case SyntaxKind.GreaterThanEqualsToken: return ExprKind.GE;
5252
case SyntaxKind.GreaterThanGreaterThanToken: return ExprKind.RSHIFT;
53+
case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: return ExprKind.URSHIFT;
5354
case SyntaxKind.LessThanLessThanToken: return ExprKind.LSHIFT;
5455
case SyntaxKind.CaretToken: return ExprKind.BIT_XOR;
5556
case SyntaxKind.QuestionQuestionToken: return ExprKind.NULL_COALESCING;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ internal static Expression Create(ExpressionNodeInfo info)
3838
case SyntaxKind.IsExpression:
3939
case SyntaxKind.AsExpression:
4040
case SyntaxKind.RightShiftExpression:
41+
case SyntaxKind.UnsignedRightShiftExpression:
4142
case SyntaxKind.LeftShiftExpression:
4243
case SyntaxKind.ExclusiveOrExpression:
4344
case SyntaxKind.CoalesceExpression:
@@ -76,6 +77,7 @@ internal static Expression Create(ExpressionNodeInfo info)
7677
case SyntaxKind.ExclusiveOrAssignmentExpression:
7778
case SyntaxKind.LeftShiftAssignmentExpression:
7879
case SyntaxKind.RightShiftAssignmentExpression:
80+
case SyntaxKind.UnsignedRightShiftAssignmentExpression:
7981
case SyntaxKind.DivideAssignmentExpression:
8082
case SyntaxKind.ModuloAssignmentExpression:
8183
case SyntaxKind.CoalesceAssignmentExpression:

csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ private bool IsImplicitOperator(out ITypeSymbol containingType)
6161
containingType = Symbol.ContainingType;
6262
if (containingType is not null)
6363
{
64-
var containingNamedType = containingType as INamedTypeSymbol;
65-
return containingNamedType is null ||
64+
return containingType is not INamedTypeSymbol containingNamedType ||
6665
!containingNamedType.GetMembers(Symbol.Name).Contains(Symbol);
6766
}
6867

@@ -83,7 +82,7 @@ private bool IsImplicitOperator(out ITypeSymbol containingType)
8382
/// </summary>
8483
/// <param name="methodName">The method name.</param>
8584
/// <param name="operatorName">The converted operator name.</param>
86-
public static bool OperatorSymbol(string methodName, out string operatorName)
85+
public static bool TryGetOperatorSymbol(string methodName, out string operatorName)
8786
{
8887
var success = true;
8988
switch (methodName)
@@ -147,6 +146,9 @@ public static bool OperatorSymbol(string methodName, out string operatorName)
147146
case "op_RightShift":
148147
operatorName = ">>";
149148
break;
149+
case "op_UnsignedRightShift":
150+
operatorName = ">>>";
151+
break;
150152
case "op_LeftShift":
151153
operatorName = "<<";
152154
break;
@@ -166,7 +168,7 @@ public static bool OperatorSymbol(string methodName, out string operatorName)
166168
var match = Regex.Match(methodName, "^op_Checked(.*)$");
167169
if (match.Success)
168170
{
169-
OperatorSymbol("op_" + match.Groups[1], out var uncheckedName);
171+
TryGetOperatorSymbol("op_" + match.Groups[1], out var uncheckedName);
170172
operatorName = "checked " + uncheckedName;
171173
break;
172174
}
@@ -190,7 +192,7 @@ private static string OperatorSymbol(Context cx, IMethodSymbol method)
190192
return OperatorSymbol(cx, method.ExplicitInterfaceImplementations.First());
191193

192194
var methodName = method.Name;
193-
if (!OperatorSymbol(methodName, out var result))
195+
if (!TryGetOperatorSymbol(methodName, out var result))
194196
cx.ModelError(method, $"Unhandled operator name in OperatorSymbol(): '{methodName}'");
195197
return result;
196198
}

0 commit comments

Comments
 (0)