Как добавить XML-комментарии к узлу MethodDeclarationSyntax с помощью Roslyn?

Я пытаюсь добавить комментарии XML к коду C# в качестве исправления кода, используя компилятор Roslyn и API CodeAnalysis Microsoft. До сих пор мне удалось выяснить, как изменить текущие комментарии XML MethodDeclarationSyntax,

Я получаю DocumentationCommentTriviaSyntax от MethodDeclarationSyntax, Поскольку эти объекты неизменны, я делаю новый DocumentationCommentTriviaSyntax с содержанием моего старого комментария, как и мой новый комментарий с помощью SyntaxFactory.DocumentationCommentTrivia, Затем я создаю новый корень для дерева синтаксиса, заменяя мой старый DocumentationCommentTriviaSyntax с моим новым root.ReplaceNode, Затем я создаю новый документ, используя этот новый корень, и возвращаю его.

Но я не могу понять, как добавить комментарий XML, если его нет, и я не смог найти какую-либо документацию, чтобы помочь мне. Если нет комментариев для начала, мой DocumentationCommentTriviaSyntax является нулевым и ReplaceNode выдает ошибку.

Может ли кто-нибудь указать мне правильное направление? Я заранее ценю помощь!

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.

Другие вопросы по тегам