簡體   English   中英

如何使用 Roslyn 將 XML 注釋添加到 MethodDeclarationSyntax 節點?

[英]How to add XML Comments to a MethodDeclarationSyntax node using Roslyn?

我正在嘗試使用 Roslyn 編譯器和 Microsoft 的 CodeAnalysis API 將 XML 注釋添加到 C# 代碼中作為代碼修復。 到目前為止,我已經能夠弄清楚如何更改MethodDeclarationSyntax當前 XML 注釋。

我從MethodDeclarationSyntax檢索DocumentationCommentTriviaSyntax 由於這些對象是不可變的,我使用我的舊評論的內容創建了一個新的DocumentationCommentTriviaSyntax ,就像我使用SyntaxFactory.DocumentationCommentTrivia新評論SyntaxFactory.DocumentationCommentTrivia 然后我為語法樹創建一個新根,使用root.ReplaceNode用我的新根替換舊的DocumentationCommentTriviaSyntax 然后我使用這個新根創建一個新文檔並返回它。

但是我似乎無法弄清楚如何添加 XML 注釋,如果沒有開始,並且無法找到任何文檔來幫助我。 如果沒有開頭的注釋,我的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM