Skip to content

Commit 4ac1f11

Browse files
committed
C#: Extract compound operator assignments as is.
1 parent 427ccee commit 4ac1f11

1 file changed

Lines changed: 7 additions & 63 deletions

File tree

  • csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions

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

Lines changed: 7 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,7 @@ public static Assignment Create(ExpressionNodeInfo info)
2222

2323
protected override void PopulateExpression(TextWriter trapFile)
2424
{
25-
var operatorKind = OperatorKind;
26-
if (operatorKind.HasValue)
27-
{
28-
// Convert assignment such as `a += b` into `a = a + b`.
29-
var simpleAssignExpr = new Expression(new ExpressionInfo(Context, Type, Location, ExprKind.SIMPLE_ASSIGN, this, 2, isCompilerGenerated: true, null));
30-
Create(Context, Syntax.Left, simpleAssignExpr, 1);
31-
var opexpr = new Expression(new ExpressionInfo(Context, Type, Location, operatorKind.Value, simpleAssignExpr, 0, isCompilerGenerated: true, null));
32-
Create(Context, Syntax.Left, opexpr, 0, isCompilerGenerated: true);
33-
Create(Context, Syntax.Right, opexpr, 1);
34-
opexpr.OperatorCall(trapFile, Syntax);
35-
}
36-
else
25+
if (Kind == ExprKind.SIMPLE_ASSIGN || Kind == ExprKind.REMOVE_EVENT || Kind == ExprKind.ADD_EVENT)
3726
{
3827
Create(Context, Syntax.Left, this, 1);
3928
Create(Context, Syntax.Right, this, 0);
@@ -43,6 +32,12 @@ protected override void PopulateExpression(TextWriter trapFile)
4332
OperatorCall(trapFile, Syntax);
4433
}
4534
}
35+
else
36+
{
37+
Create(Context, Syntax.Left, this, 0);
38+
Create(Context, Syntax.Right, this, 1);
39+
OperatorCall(trapFile, Syntax);
40+
}
4641
}
4742

4843
private static ExprKind GetAssignmentOperation(Context cx, AssignmentExpressionSyntax syntax)
@@ -108,56 +103,5 @@ private static ExprKind GetKind(Context cx, AssignmentExpressionSyntax syntax)
108103

109104
return kind;
110105
}
111-
112-
/// <summary>
113-
/// Gets the kind of this assignment operator (<code>null</code> if the
114-
/// assignment is not an assignment operator). For example, the operator
115-
/// kind of `*=` is `*`.
116-
/// </summary>
117-
private ExprKind? OperatorKind
118-
{
119-
get
120-
{
121-
var kind = Kind;
122-
if (kind == ExprKind.REMOVE_EVENT || kind == ExprKind.ADD_EVENT || kind == ExprKind.SIMPLE_ASSIGN)
123-
return null;
124-
125-
if (CallType.AdjustKind(kind) == ExprKind.OPERATOR_INVOCATION)
126-
return ExprKind.OPERATOR_INVOCATION;
127-
128-
switch (kind)
129-
{
130-
case ExprKind.ASSIGN_ADD:
131-
return ExprKind.ADD;
132-
case ExprKind.ASSIGN_AND:
133-
return ExprKind.BIT_AND;
134-
case ExprKind.ASSIGN_DIV:
135-
return ExprKind.DIV;
136-
case ExprKind.ASSIGN_LSHIFT:
137-
return ExprKind.LSHIFT;
138-
case ExprKind.ASSIGN_MUL:
139-
return ExprKind.MUL;
140-
case ExprKind.ASSIGN_OR:
141-
return ExprKind.BIT_OR;
142-
case ExprKind.ASSIGN_REM:
143-
return ExprKind.REM;
144-
case ExprKind.ASSIGN_RSHIFT:
145-
return ExprKind.RSHIFT;
146-
case ExprKind.ASSIGN_URSHIFT:
147-
return ExprKind.URSHIFT;
148-
case ExprKind.ASSIGN_SUB:
149-
return ExprKind.SUB;
150-
case ExprKind.ASSIGN_XOR:
151-
return ExprKind.BIT_XOR;
152-
case ExprKind.ASSIGN_COALESCE:
153-
return ExprKind.NULL_COALESCING;
154-
default:
155-
Context.ModelError(Syntax, $"Couldn't unfold assignment of type {kind}");
156-
return ExprKind.UNKNOWN;
157-
}
158-
}
159-
}
160-
161-
public new CallType CallType => GetCallType(Context, Syntax);
162106
}
163107
}

0 commit comments

Comments
 (0)