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

标签 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抛出错误。

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

最佳答案

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

关于c# - 如何使用 Roslyn 将 XML 注释添加到 MethodDeclarationSyntax 节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41555962/

相关文章:

xml - Delphi 和 XML CDATA

visual-studio - 如何在 Visual Studio 中针对不同环境使用不同配置来部署 Azure WebJob

javascript - 如何使用 WEB API 2 Controller 在 Angular.js 和 PostgreSQL 之间创建连接?

c# - 如何通过 C# 启动/停止/查询 iis 应用程序(不是站点,不是应用程序池)?

c# - 如何通过代码启用EnableSqlCommandTextInstrumentation?

c# - 要 float 的字节数组

python - 使用 Python xml.sax 打开命名空间模式

c# - 字典使用不当?

xml - 拉撒路/自由帕斯卡 : read/write nodes with the same name using TXMLConfig

c# - 是否可以在 visual studio 调试 session 之间保留 cookie