Skip to content

Commit 5ab64f4

Browse files
committed
C#: Introduce extractor support for collection expressions.
1 parent 0477bba commit 5ab64f4

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.IO;
2+
using Microsoft.CodeAnalysis.CSharp;
3+
using Microsoft.CodeAnalysis.CSharp.Syntax;
4+
using Semmle.Util;
5+
using Semmle.Extraction.Kinds;
6+
7+
namespace Semmle.Extraction.CSharp.Entities.Expressions
8+
{
9+
internal class Collection : Expression<CollectionExpressionSyntax>
10+
{
11+
private Collection(ExpressionNodeInfo info) : base(info.SetKind(ExprKind.COLLECTION)) { }
12+
13+
protected override void PopulateExpression(TextWriter trapFile) =>
14+
Syntax.Elements.ForEach((element, i) =>
15+
{
16+
switch (element.Kind())
17+
{
18+
case SyntaxKind.ExpressionElement:
19+
{
20+
Create(Context, ((ExpressionElementSyntax)element).Expression, this, i);
21+
return;
22+
}
23+
case SyntaxKind.SpreadElement:
24+
{
25+
Spread.Create(Context, (SpreadElementSyntax)element, this, i);
26+
return;
27+
}
28+
default:
29+
{
30+
Context.ModelError(element, $"Unhandled collection element type {element.Kind()}");
31+
return;
32+
}
33+
}
34+
});
35+
36+
public static Expression Create(ExpressionNodeInfo info) => new Collection(info).TryPopulate();
37+
}
38+
}
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 Spread : Expression
7+
{
8+
public Spread(Context cx, SpreadElementSyntax syntax, IExpressionParentEntity parent, int child) :
9+
base(new ExpressionInfo(cx, null, cx.CreateLocation(syntax.GetLocation()), ExprKind.SPREAD_ELEMENT, parent, child, false, null))
10+
{
11+
Create(cx, syntax.Expression, this, 0);
12+
}
13+
14+
public static Expression Create(Context cx, SpreadElementSyntax syntax, IExpressionParentEntity parent, int child) =>
15+
new Spread(cx, syntax, parent, child);
16+
}
17+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,9 @@ internal static Expression Create(ExpressionNodeInfo info)
256256
case SyntaxKind.WithExpression:
257257
return WithExpression.Create(info);
258258

259+
case SyntaxKind.CollectionExpression:
260+
return Collection.Create(info);
261+
259262
default:
260263
info.Context.ModelError(info.Node, $"Unhandled expression '{info.Node}' of kind '{info.Node.Kind()}'");
261264
return new Unknown(info);

0 commit comments

Comments
 (0)