Skip to content

Commit cfd3c1f

Browse files
committed
C#: Add extractor support for list- and slice patterns.
1 parent 00354a2 commit cfd3c1f

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using Microsoft.CodeAnalysis.CSharp.Syntax;
2+
using Semmle.Extraction.Kinds;
3+
using Semmle.Util;
4+
5+
namespace Semmle.Extraction.CSharp.Entities.Expressions
6+
{
7+
internal class ListPattern : Expression
8+
{
9+
internal ListPattern(Context cx, ListPatternSyntax syntax, IExpressionParentEntity parent, int child) :
10+
base(new ExpressionInfo(cx, null, cx.CreateLocation(syntax.GetLocation()), ExprKind.LIST_PATTERN, parent, child, false, null))
11+
{
12+
syntax.Patterns.ForEach((p, i) => Pattern.Create(cx, p, this, i));
13+
}
14+
}
15+
}

csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Patterns/Pattern.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ internal static Expression Create(Context cx, PatternSyntax syntax, IExpressionP
7474
case DiscardPatternSyntax dp:
7575
return new Discard(cx, dp, parent, child);
7676

77+
case ListPatternSyntax listPattern:
78+
return new ListPattern(cx, listPattern, parent, child);
79+
80+
case SlicePatternSyntax slicePattern:
81+
return new SlicePattern(cx, slicePattern, parent, child);
82+
7783
default:
7884
throw new InternalError(syntax, "Pattern not handled");
7985
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Microsoft.CodeAnalysis.CSharp.Syntax;
2+
using Semmle.Extraction.Kinds;
3+
4+
namespace Semmle.Extraction.CSharp.Entities.Expressions
5+
{
6+
internal class SlicePattern : Expression
7+
{
8+
public SlicePattern(Context cx, SlicePatternSyntax syntax, IExpressionParentEntity parent, int child) :
9+
base(new ExpressionInfo(cx, null, cx.CreateLocation(syntax.GetLocation()), ExprKind.SLICE_PATTERN, parent, child, false, null))
10+
{
11+
if (syntax.Pattern is not null)
12+
{
13+
Pattern.Create(cx, syntax.Pattern, this, 0);
14+
}
15+
}
16+
}
17+
}

csharp/extractor/Semmle.Util/IEnumerableExtensions.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,19 @@ public static void ForEach<T>(this IEnumerable<T> items, Action<T> a)
7979
a(item);
8080
}
8181

82+
/// <summary>
83+
/// Applies the action <paramref name="a"/> to each item and its index in this collection.
84+
/// </summary>
85+
public static void ForEach<T>(this IEnumerable<T> items, Action<T, int> a)
86+
{
87+
var i = 0;
88+
foreach (var item in items)
89+
{
90+
a(item, i);
91+
i++;
92+
}
93+
}
94+
8295
/// <summary>
8396
/// Forces enumeration of this collection and discards the result.
8497
/// </summary>

0 commit comments

Comments
 (0)