如何使用Roslyn将XML注释添加到MethodDeclarationSyntax节点?

时间:2017-01-09 20:01:20

标签: c# xml visual-studio roslyn roslyn-code-analysis

我正在尝试使用Roslyn编译器和Microsoft的CodeAnalysis API将XML注释添加到C#代码作为代码修复。到目前为止,我已经能够弄清楚如何更改MethodDeclarationSyntax的当前XML注释。

我从DocumentationCommentTriviaSyntax检索MethodDeclarationSyntax。由于这些对象是不可变的,因此我使用DocumentationCommentTriviaSyntax创建一个新的SyntaxFactory.DocumentationCommentTrivia,其中包含旧评论的内容。然后,我为语法树创建了一个新的根,使用DocumentationCommentTriviaSyntax替换旧的root.ReplaceNode。然后我使用这个新根创建一个新文档并返回它。

但是我似乎无法弄清楚如果没有任何内容可以添加XML注释,并且无法找到任何文档来帮助我。如果没有评论开头,我的DocumentationCommentTriviaSyntax为空,ReplaceNode会引发错误。

有人能指出我正确的方向吗?我提前感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您需要修改MethodDeclarationSyntax并使用它调用ReplaceNode。

所以,让我们说我们有以下文件琐事:

var testDocumentation = SyntaxFactory.DocumentationCommentTrivia(
    SyntaxKind.SingleLineDocumentationCommentTrivia,
    SyntaxFactory.List<XmlNodeSyntax>(
        new XmlNodeSyntax[]{
            SyntaxFactory.XmlText()
            .WithTextTokens(
                SyntaxFactory.TokenList(
                    SyntaxFactory.XmlTextLiteral(
                        SyntaxFactory.TriviaList(
                            SyntaxFactory.DocumentationCommentExterior("///")),
                        " ",
                        " ",
                        SyntaxFactory.TriviaList()))),
            SyntaxFactory.XmlElement(
                SyntaxFactory.XmlElementStartTag(
                    SyntaxFactory.XmlName(
                        SyntaxFactory.Identifier("summary"))),
                SyntaxFactory.XmlElementEndTag(
                    SyntaxFactory.XmlName(
                        SyntaxFactory.Identifier("summary"))))
            .WithContent(
                SyntaxFactory.SingletonList<XmlNodeSyntax>(
                    SyntaxFactory.XmlText()
                    .WithTextTokens(
                        SyntaxFactory.TokenList(
                            SyntaxFactory.XmlTextLiteral(
                                SyntaxFactory.TriviaList(),
                                "test",
                                "test",
                                SyntaxFactory.TriviaList()))))),
            SyntaxFactory.XmlText()
            .WithTextTokens(
                SyntaxFactory.TokenList(
                    SyntaxFactory.XmlTextNewLine(
                        SyntaxFactory.TriviaList(),
                        "\n",
                        "\n",
                        SyntaxFactory.TriviaList())))}));

...我们有一个public static void Main()方法,我们想要添加文档。它已经有了琐事(但不一定):

SyntaxFactory.TokenList(
    new []{
        SyntaxFactory.Token(SyntaxKind.PublicKeyword),
        SyntaxFactory.Token(SyntaxKind.StaticKeyword)}));

我们需要将新的琐事列表中的第一个令牌内容包装在该列表中(我将把它留给您以编程方式进行...):

var newMethodNode = oldMethodNode.WithModifiers(
    SyntaxFactory.TokenList(
        new []{
            SyntaxFactory.Token(
                SyntaxFactory.TriviaList(
                    SyntaxFactory.Trivia(testDocumentation)), // xmldoc
                    SyntaxKind.PublicKeyword, // original 1st token
                    SyntaxFactory.TriviaList()),
            SyntaxFactory.Token(SyntaxKind.StaticKeyword)}))

root.ReplaceNode (oldMethodNode, newMethodNode);

要弄清楚要构建的琐事,请使用RoslynQuoter