В чем причина передачи SyntaxKind в фабричные методы класса Syntax?

В Roslyn CTP довольно часто используется следующая сигнатура методов:

LiteralExpressionSyntax LiteralExpression(SyntaxKind kind, SyntaxToken token)

В чем причина передачи SyntaxKind? token сам имеет свойство Kind, почему Roslyn его не использует?

Чтобы быть более точным, он берет предоставленный пользователем kind, утверждает, что он ограничен узким набором значений, затем проверяет, что Kind token также принадлежит к этому узкому набору, а затем передает предоставленный пользователем kind дальше.

Почему Roslyn не использует token.Kind и заставляет пользователя передавать явный вид?

UPD: Собственно, главный вопрос: в каких случаях kind, переданный пользователем, будет отличаться от вида token?


person Mikhail Brinchuk    schedule 23.06.2013    source источник
comment
Являются ли другие их подклассы своего рода?   -  person Sayse    schedule 23.06.2013
comment
kind — это огромное перечисление со всевозможными видами синтаксиса, такими как StringLiteralExpression и так далее.   -  person Mikhail Brinchuk    schedule 23.06.2013


Ответы (1)


Если вы внимательно посмотрите, то увидите, что проверяемые типы не на самом деле одинаковы в каждом случае. Существуют отдельные выражения SyntaxKinds for и , поэтому у вас будет SyntaxKind.TrueKeyword для токена и SyntaxKind.TrueLiteralExpression для результирующего LiteralExpressionSyntax. Чтобы ответить на ваш обновленный вопрос, полученное expression.Kind никогда не будет совпадать с token.Kind.

Тем не менее, похоже, что в этом случае существует однозначное соответствие видов токенов и видов выражений, что означает, что мы можем получить вид выражения из вида токена. Я подниму это внутренне.

person Kevin Pilch    schedule 23.06.2013
comment
Интересно, в чем семантическая разница между SyntaxKind.TrueKeyword и TrueLiteralExpression. - person Mikhail Brinchuk; 23.06.2013
comment
Один представляет токен или терминал в грамматике, а другой — SyntaxNode или нетерминал в грамматике. У нас была цель дизайна, чтобы мы не смешивали значения между ними. - person Kevin Pilch; 24.06.2013
comment
@MikhailBrinchuk Ключевое слово true не обязательно представляет литерал типа bool. Например, это может быть часть объявления определяемого пользователем оператора public static bool operator true(...). - person Vladimir Reshetnikov; 19.04.2014