From dc80a029cbb3cee49e91555c6b4b55391f22b492 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 13 May 2026 09:43:48 +0200 Subject: [PATCH 1/3] C#: Streamline the AddOperatorCall logic for prefix and postfix unary operators. --- .../Entities/Expressions/PostfixUnary.cs | 9 ++++++--- .../Entities/Expressions/Unary.cs | 11 +++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs index 051a03e9f8c2..0ccb8cd7a85a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs @@ -22,11 +22,14 @@ protected override void PopulateExpression(TextWriter trapFile) { Create(Context, operand, this, 0); - if ((operatorKind == ExprKind.POST_INCR || operatorKind == ExprKind.POST_DECR) && - Kind == ExprKind.OPERATOR_INVOCATION) + if (Kind == ExprKind.OPERATOR_INVOCATION) { AddOperatorCall(trapFile, Syntax); - trapFile.mutator_invocation_mode(this, 2); + + if (operatorKind == ExprKind.POST_INCR || operatorKind == ExprKind.POST_DECR) + { + trapFile.mutator_invocation_mode(this, 2); + } } } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs index 699c3810d116..c063a5ef0155 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs @@ -24,12 +24,15 @@ public static Unary Create(ExpressionNodeInfo info) protected override void PopulateExpression(TextWriter trapFile) { Create(Context, Syntax.Operand, this, 0); - AddOperatorCall(trapFile, Syntax); - if ((operatorKind == ExprKind.PRE_INCR || operatorKind == ExprKind.PRE_DECR) && - Kind == ExprKind.OPERATOR_INVOCATION) + if (Kind == ExprKind.OPERATOR_INVOCATION) { - trapFile.mutator_invocation_mode(this, 1); + AddOperatorCall(trapFile, Syntax); + + if (operatorKind == ExprKind.PRE_INCR || operatorKind == ExprKind.PRE_DECR) + { + trapFile.mutator_invocation_mode(this, 1); + } } } } From a72cef6fda366fe81cc96c8b003fb6961f98b4bc Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 13 May 2026 09:58:45 +0200 Subject: [PATCH 2/3] C#: Rename Unary to PrefixUnary. --- .../Entities/Expressions/Factory.cs | 18 +++++++++--------- .../Expressions/{Unary.cs => PrefixUnary.cs} | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) rename csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/{Unary.cs => PrefixUnary.cs} (77%) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs index ed8dae3738fc..8b945e2ef17e 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs @@ -109,10 +109,10 @@ internal static Expression Create(ExpressionNodeInfo info) return MemberAccess.Create(info, (MemberAccessExpressionSyntax)info.Node); case SyntaxKind.UnaryMinusExpression: - return Unary.Create(info.SetKind(ExprKind.MINUS)); + return PrefixUnary.Create(info.SetKind(ExprKind.MINUS)); case SyntaxKind.UnaryPlusExpression: - return Unary.Create(info.SetKind(ExprKind.PLUS)); + return PrefixUnary.Create(info.SetKind(ExprKind.PLUS)); case SyntaxKind.SimpleLambdaExpression: return Lambda.Create(info, (SimpleLambdaExpressionSyntax)info.Node); @@ -146,16 +146,16 @@ internal static Expression Create(ExpressionNodeInfo info) return Name.Create(info); case SyntaxKind.LogicalNotExpression: - return Unary.Create(info.SetKind(ExprKind.LOG_NOT)); + return PrefixUnary.Create(info.SetKind(ExprKind.LOG_NOT)); case SyntaxKind.BitwiseNotExpression: - return Unary.Create(info.SetKind(ExprKind.BIT_NOT)); + return PrefixUnary.Create(info.SetKind(ExprKind.BIT_NOT)); case SyntaxKind.PreIncrementExpression: - return Unary.Create(info.SetKind(ExprKind.PRE_INCR)); + return PrefixUnary.Create(info.SetKind(ExprKind.PRE_INCR)); case SyntaxKind.PreDecrementExpression: - return Unary.Create(info.SetKind(ExprKind.PRE_DECR)); + return PrefixUnary.Create(info.SetKind(ExprKind.PRE_DECR)); case SyntaxKind.ThisExpression: return This.CreateExplicit(info); @@ -164,10 +164,10 @@ internal static Expression Create(ExpressionNodeInfo info) return PropertyFieldAccess.Create(info); case SyntaxKind.AddressOfExpression: - return Unary.Create(info.SetKind(ExprKind.ADDRESS_OF)); + return PrefixUnary.Create(info.SetKind(ExprKind.ADDRESS_OF)); case SyntaxKind.PointerIndirectionExpression: - return Unary.Create(info.SetKind(ExprKind.POINTER_INDIRECTION)); + return PrefixUnary.Create(info.SetKind(ExprKind.POINTER_INDIRECTION)); case SyntaxKind.DefaultExpression: return Default.Create(info); @@ -248,7 +248,7 @@ internal static Expression Create(ExpressionNodeInfo info) return RangeExpression.Create(info); case SyntaxKind.IndexExpression: - return Unary.Create(info.SetKind(ExprKind.INDEX)); + return PrefixUnary.Create(info.SetKind(ExprKind.INDEX)); case SyntaxKind.SwitchExpression: return Switch.Create(info); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs similarity index 77% rename from csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs rename to csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs index c063a5ef0155..11e744e0c05c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Unary.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs @@ -4,9 +4,9 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions { - internal class Unary : Expression + internal class PrefixUnary : Expression { - private Unary(ExpressionNodeInfo info, ExprKind kind) + private PrefixUnary(ExpressionNodeInfo info, ExprKind kind) : base(info.SetKind(UnaryOperatorKind(info.Context, info.Kind, info.Node))) { operatorKind = kind; @@ -14,9 +14,9 @@ private Unary(ExpressionNodeInfo info, ExprKind kind) private readonly ExprKind operatorKind; - public static Unary Create(ExpressionNodeInfo info) + public static PrefixUnary Create(ExpressionNodeInfo info) { - var ret = new Unary(info, info.Kind); + var ret = new PrefixUnary(info, info.Kind); ret.TryPopulate(); return ret; } From 30a5769e20645eef226238cbfea0e935eb6aa613 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 13 May 2026 10:03:07 +0200 Subject: [PATCH 3/3] C#: Simplify and streamline the implementation of Prefix and Postfix unary expressions. --- .../Entities/Expressions/Factory.cs | 6 +++--- .../Entities/Expressions/PostfixUnary.cs | 10 ++++------ .../Entities/Expressions/PrefixUnary.cs | 7 +------ 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs index 8b945e2ef17e..70760590070e 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Factory.cs @@ -58,10 +58,10 @@ internal static Expression Create(ExpressionNodeInfo info) return Invocation.Create(info); case SyntaxKind.PostIncrementExpression: - return PostfixUnary.Create(info.SetKind(ExprKind.POST_INCR), ((PostfixUnaryExpressionSyntax)info.Node).Operand); + return PostfixUnary.Create(info.SetKind(ExprKind.POST_INCR)); case SyntaxKind.PostDecrementExpression: - return PostfixUnary.Create(info.SetKind(ExprKind.POST_DECR), ((PostfixUnaryExpressionSyntax)info.Node).Operand); + return PostfixUnary.Create(info.SetKind(ExprKind.POST_DECR)); case SyntaxKind.AwaitExpression: return Await.Create(info); @@ -254,7 +254,7 @@ internal static Expression Create(ExpressionNodeInfo info) return Switch.Create(info); case SyntaxKind.SuppressNullableWarningExpression: - return PostfixUnary.Create(info.SetKind(ExprKind.SUPPRESS_NULLABLE_WARNING), ((PostfixUnaryExpressionSyntax)info.Node).Operand); + return PostfixUnary.Create(info.SetKind(ExprKind.SUPPRESS_NULLABLE_WARNING)); case SyntaxKind.WithExpression: return WithExpression.Create(info); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs index 0ccb8cd7a85a..dd7682bf7bb6 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PostfixUnary.cs @@ -4,23 +4,21 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions { - internal class PostfixUnary : Expression + internal class PostfixUnary : Expression { - private PostfixUnary(ExpressionNodeInfo info, ExprKind kind, ExpressionSyntax operand) + private PostfixUnary(ExpressionNodeInfo info, ExprKind kind) : base(info.SetKind(UnaryOperatorKind(info.Context, kind, info.Node))) { - this.operand = operand; operatorKind = kind; } - private readonly ExpressionSyntax operand; private readonly ExprKind operatorKind; - public static Expression Create(ExpressionNodeInfo info, ExpressionSyntax operand) => new PostfixUnary(info, info.Kind, operand).TryPopulate(); + public static Expression Create(ExpressionNodeInfo info) => new PostfixUnary(info, info.Kind).TryPopulate(); protected override void PopulateExpression(TextWriter trapFile) { - Create(Context, operand, this, 0); + Create(Context, Syntax.Operand, this, 0); if (Kind == ExprKind.OPERATOR_INVOCATION) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs index 11e744e0c05c..ca58a8aeb283 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/PrefixUnary.cs @@ -14,12 +14,7 @@ private PrefixUnary(ExpressionNodeInfo info, ExprKind kind) private readonly ExprKind operatorKind; - public static PrefixUnary Create(ExpressionNodeInfo info) - { - var ret = new PrefixUnary(info, info.Kind); - ret.TryPopulate(); - return ret; - } + public static Expression Create(ExpressionNodeInfo info) => new PrefixUnary(info, info.Kind).TryPopulate(); protected override void PopulateExpression(TextWriter trapFile) {