Merge pull request #15426 from michaelnebel/csharp/collectionexpressions

C# 12: Support for collection expressions.
This commit is contained in:
Michael Nebel
2024-01-30 10:39:39 +01:00
committed by GitHub
25 changed files with 9217 additions and 552 deletions

View File

@@ -0,0 +1,38 @@
using System.IO;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Semmle.Util;
using Semmle.Extraction.Kinds;
namespace Semmle.Extraction.CSharp.Entities.Expressions
{
internal class Collection : Expression<CollectionExpressionSyntax>
{
private Collection(ExpressionNodeInfo info) : base(info.SetKind(ExprKind.COLLECTION)) { }
protected override void PopulateExpression(TextWriter trapFile) =>
Syntax.Elements.ForEach((element, i) =>
{
switch (element.Kind())
{
case SyntaxKind.ExpressionElement:
{
Create(Context, ((ExpressionElementSyntax)element).Expression, this, i);
return;
}
case SyntaxKind.SpreadElement:
{
Spread.Create(Context, (SpreadElementSyntax)element, this, i);
return;
}
default:
{
Context.ModelError(element, $"Unhandled collection element type {element.Kind()}");
return;
}
}
});
public static Expression Create(ExpressionNodeInfo info) => new Collection(info).TryPopulate();
}
}

View File

@@ -0,0 +1,17 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Semmle.Extraction.Kinds;
namespace Semmle.Extraction.CSharp.Entities.Expressions
{
internal class Spread : Expression
{
public Spread(Context cx, SpreadElementSyntax syntax, IExpressionParentEntity parent, int child) :
base(new ExpressionInfo(cx, null, cx.CreateLocation(syntax.GetLocation()), ExprKind.SPREAD_ELEMENT, parent, child, false, null))
{
Create(cx, syntax.Expression, this, 0);
}
public static Expression Create(Context cx, SpreadElementSyntax syntax, IExpressionParentEntity parent, int child) =>
new Spread(cx, syntax, parent, child);
}
}

View File

@@ -256,6 +256,9 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
case SyntaxKind.WithExpression:
return WithExpression.Create(info);
case SyntaxKind.CollectionExpression:
return Collection.Create(info);
default:
info.Context.ModelError(info.Node, $"Unhandled expression '{info.Node}' of kind '{info.Node.Kind()}'");
return new Unknown(info);

View File

@@ -130,6 +130,8 @@ namespace Semmle.Extraction.Kinds
URSHIFT = 133,
ASSIGN_URSHIFT = 134,
UTF8_STRING_LITERAL = 135,
COLLECTION = 136,
SPREAD_ELEMENT = 137,
DEFINE_SYMBOL = 999,
}
}