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

How to add XML Comments to a MethodDeclarationSyntax node using Roslyn?

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

的当前 XML 评论

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

但我似乎无法弄清楚如何添加 XML 注释(如果有 none 开头并且无法找到任何文档来帮助我。如果没有评论开头,我的 DocumentationCommentTriviaSyntax 为 null 并且 ReplaceNode 抛出错误。

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

您需要修改 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