C#: Extract relational patterns

This commit is contained in:
Tamas Vajk
2020-11-11 13:44:37 +01:00
parent c751c516bf
commit b11fc2f957
12 changed files with 177 additions and 2 deletions

View File

@@ -42,6 +42,9 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
case RecursivePatternSyntax recPattern:
return new RecursivePattern(cx, recPattern, parent, child);
case RelationalPatternSyntax relPattern:
return new RelationalPattern(cx, relPattern, parent, child);
case VarPatternSyntax varPattern:
switch (varPattern.Designation)
{

View File

@@ -6,7 +6,7 @@ using Semmle.Extraction.Entities;
namespace Semmle.Extraction.CSharp.Entities.Expressions
{
internal class RecursivePattern : Expression
internal partial class RecursivePattern : Expression
{
/// <summary>
/// Creates and populates a recursive pattern.

View File

@@ -0,0 +1,29 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp;
using Semmle.Extraction.Kinds;
using Semmle.Extraction.Entities;
namespace Semmle.Extraction.CSharp.Entities.Expressions
{
internal class RelationalPattern : Expression
{
public RelationalPattern(Context cx, RelationalPatternSyntax syntax, IExpressionParentEntity parent, int child) :
base(new ExpressionInfo(cx, NullType.Create(cx), cx.Create(syntax.GetLocation()), GetKind(syntax.OperatorToken), parent, child, false, null))
{
Expression.Create(cx, syntax.Expression, this, 0);
}
private static ExprKind GetKind(SyntaxToken operatorToken)
{
return operatorToken.Kind() switch
{
SyntaxKind.LessThanEqualsToken => ExprKind.LE_PATTERN,
SyntaxKind.GreaterThanEqualsToken => ExprKind.GE_PATTERN,
SyntaxKind.LessThanToken => ExprKind.LT_PATTERN,
SyntaxKind.GreaterThanToken => ExprKind.GT_PATTERN,
_ => throw new InternalError(operatorToken.Parent, $"Relation pattern with operator token '{operatorToken.Kind()}' is not supported."),
};
}
}
}