我正在尝试使用 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/