Вопрос или проблема
Мне нужен исчерпывающий список SyntaxKind, который относится к SyntaxToken, и список SyntaxKind, который относится к SyntaxNode. Дело в том, что SyntaxKind содержит не только виды, относящиеся к SyntaxToken, но и виды, относящиеся к SyntaxNode, и я не знал, как их различать. Мне нужен этот список, потому что я хочу знать все возможные виды для SyntaxToken и все возможные виды для SyntaxNode. Например, вид PublicKeyword принадлежит SyntaxToken, а вид ClassDeclaration принадлежит SyntaxNode, и оба они находятся в SyntaxKind.
Мне нужен список для версии Roslyn 3.11.0 (C#9.0) и версии 4.9.2 (C#12.0). Может ли кто-нибудь помочь мне с этим? Заранее спасибо.
Я пытался искать, но не могу найти это.
Спасибо DoctorKrolic на Discord по C# за этот ответ. В классе Microsoft.CodeAnalysis.CSharp.SyntaxFacts
есть метод IsAnyToken(SyntaxKind)
. У метода нет описания в документации, но похоже, что метод возвращает true, когда аргумент SyntaxKind относится к SyntaxToken, и false в противном случае. Я могу использовать этот метод для генерации списка SyntaxKind, который принадлежит SyntaxToken, перебирая перечисление SyntaxKind и проверяя, принадлежит ли он SyntaxToken, используя IsAnyToken. SyntaxKind, который не появился в сгенерированном списке, означает, что он относится к SyntaxNode.
Ответ или решение
Конечно! Ниже представлена полная информация о перечислениях SyntaxKind
, которые принадлежат к SyntaxToken
и SyntaxNode
в версиях Roslyn 3.11.0 (C# 9.0) и 4.9.2 (C# 12.0).
Список SyntaxKind, принадлежащий SyntaxToken:
В версии Roslyn 3.11.0 (C# 9.0):
- DoubleQuoteToken
- IdentifierToken
- IntegerLiteralToken
- KeywordToken (содержит ключевые слова)
- OpenParenToken
- CloseParenToken
- PlusToken
- MinusToken
- SemicolonToken
- WhitespaceTrivia
- SingleLineCommentTrivia
- MultiLineCommentTrivia
- StringLiteralToken
- CharLiteralToken
- DefaultLiteralToken
- TrueKeyword
- FalseKeyword
(и возможно другие токены, связанные с синтаксисом и структурой языка)
В версии Roslyn 4.9.2 (C# 12.0):
Список включает в себя похожие элементы, но могут быть добавлены или изменены некоторые токены:
- GlobalKeywordToken
- RequiresKeyword
- NewlineTrivia
- SingleQuoteToken
- LineBreakTrivia
(для получения более полного списка обратитесь к исходному коду Roslyn или выполните проверку с помощью IsAnyToken
).
Список SyntaxKind, принадлежащий SyntaxNode:
В версии Roslyn 3.11.0 (C# 9.0):
- CompilationUnit
- NamespaceDeclaration
- ClassDeclaration
- MethodDeclaration
- PropertyDeclaration
- FieldDeclaration
- IfStatement
- ForStatement
- WhileStatement
- ReturnStatement
- Block
- ParameterList
- ArgumentList
- ExpressionStatement
- LocalDeclarationStatement
В версии Roslyn 4.9.2 (C# 12.0):
Здесь тоже возможны изменения и добавления:
- FileScopedNamespaceDeclaration
- RecordDeclaration
- WithExpression
- InitAccessor
- IndexersDeclaration
Также обратите внимание, что в зависимости от структуры и изменений в языке могут добавляться новые синтаксические элементы или изменяться существующие.
Рекомендации:
Вы можете использовать метод IsAnyToken(SyntaxKind)
в классе Microsoft.CodeAnalysis.CSharp.SyntaxFacts
, чтобы автоматически определять, принадлежит ли конкретный SyntaxKind
к SyntaxToken
или SyntaxNode
. Это будет особенно полезно, если ваши версии меняются или вам требуется проверить более поздние версии Roslyn.
Советую также проверить официальную документацию Roslyn и исходный код, чтобы оставаться в курсе изменений, так как информация может обновляться.