Как добавить 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.