Что такое PatternSyntax в Roslyn - PullRequest
       49

Что такое PatternSyntax в Roslyn

2 голосов
/ 20 октября 2019

Это кажется довольно глупым вопросом, и я не уверен, что он подходит для StackOverflow.

Пользователь моего инструмента сообщил об ошибке с сообщением

Unable to cast object of type
'Microsoft.CodeAnalysis.CSharp.Syntax.LiteralExpressionSyntax' to type
'Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax'.

Донточно не знаю, как выглядит его код (по крайней мере, пока). Я мог бы воспроизвести ошибку, если бы мог написать некоторый код, содержащий PatternSyntax.

Моя проблема в том, что я понятия не имею, какая языковая конструкция в C # генерирует синтаксический узел типа PatternSyntax.

Кто-нибудь может мне помочь с примером?

1 Ответ

2 голосов
/ 21 октября 2019

Я считаю, что это часть синтаксиса, сгенерированного из Pattern Matching . spec для этой функции описывает грамматику вместе с некоторыми другими примерами.

PatternSyntax определено здесь: http://source.roslyn.io/Microsoft.CodeAnalysis.CSharp/Generated/Syntax.xml.Internal.Generated.cs.html#b554fa43e6090c28

Следующее наследование от PatternSyntax

DiscardPatternSyntax
DeclarationPatternSyntax
VarPatternSyntax
RecursivePatternSyntax
ConstantPatternSyntax

Я полагаю, один пример VarPatternSyntax - это var o в следующем:

static object CreateShape(string shapeDescription)
{
    switch (shapeDescription)
    {
        case var o when (o?.Trim().Length ?? 0) == 0:
            // white space
            return null;
        default:
            return "invalid shape description";
    }            
}

Мы можем взять приведенный выше код и передать его в RoslynQuoter чтобы увидеть, как его сгенерировать, и это будет выглядеть примерно так:

CasePatternSwitchLabel(
            VarPattern(
                SingleVariableDesignation(
                    Identifier("o"))),
            Token(SyntaxKind.ColonToken))
        .WithWhenClause(
            WhenClause(
                BinaryExpression(
                    SyntaxKind.EqualsExpression,
                    ParenthesizedExpression(
                        BinaryExpression(
                            SyntaxKind.CoalesceExpression,
                            ConditionalAccessExpression(
                                IdentifierName("o"),
                                MemberAccessExpression(
                                    SyntaxKind.SimpleMemberAccessExpression,
                                    InvocationExpression(
                                        MemberBindingExpression(
                                            IdentifierName("Trim"))),
                                    IdentifierName("Length"))),
                            LiteralExpression(
                                SyntaxKind.NumericLiteralExpression,
                                Literal(0)))),
                    LiteralExpression(
                        SyntaxKind.NumericLiteralExpression,
                        Literal(0)))))))
...