你如何解析Roslyn SyntaxTrivia

时间:2018-01-06 09:57:43

标签: c# vb.net parsing roslyn

我想查看Roslyn SyntaxTrivia并查看VB代码中的各个部分,但我还是看不到要分开各种类型的部分。有很多类型,只为C#我找到了下面的类型(不完整)。通常在Roslyn中,您可以将对象转换为更具体的类型,然后查看特定于语言的部分。我不知道如何用Trivia做到这一点。

URL

1 个答案:

答案 0 :(得分:3)

大多数琐事只是 - 没有进一步信息的琐事。但是,有些琐事包含SyntaxNodes,您可以像往常一样解析和处理一小段差异 - 您需要告诉您的方法您想要找到它们。这些不是SyntaxTrivias,而是StructuredTriviaSyntax元素,您可以按如下方式找到它们:

// C#
var structuredTriviaSyntax = root.DescendantNodes(
                                    descendIntoTrivia: true)
                                        .OfType<StructuredTriviaSyntax>();

// VB
Dim structuredTriviaSyntax = root.DescendantNodes(
                                    descendIntoTrivia:=True)
                                        .OfType(Of StructuredTriviaSyntax)

您可以通过调用SyntaxTrivia对象的GetStructure方法从SyntaxTrivia对象获取StructuredTrivia:

// C#
var leadingTrivia = anySyntaxNode.GetLeadingTrivia();
foreach(var trivia in leadingTrivia){
    var structure = trivia.GetStructure();
}

// VB
Dim leadingTrivia = anySyntaxNode.GetLeadingTrivia
For Each trivia In leadingTrivia
    Dim structureNode = trivia.GetStructure
Next

这对所有类型的琐事都不起作用,因为大多数琐事都没有SyntaxNode表示,但是例如DocumentationCommentTriviaSyntax以及RegionDirectiveTriviaSyntax和EndRegionDirectiveTriviaSyntax都提供了更具体的类型,可以通过这种方式进行分析。

如果使用SyntaxWalker或SyntaxRewriter,则需要在构造函数中传递“true”作为参数来搜索琐事。

然后可以通过查看各种Xml语法元素的DescendandNodes来分析DocumentationCommentTriviaSyntax。