如何使用 Roslyn 向 MethodDeclarationSyntax 节点添加 XML 注释?
How to add XML Comments to a MethodDeclarationSyntax node using Roslyn?
我正在尝试使用 Roslyn 编译器和 Microsoft 的 CodeAnalysis API 向 C# 代码添加 XML 注释作为代码修复。到目前为止,我已经能够弄清楚如何更改 MethodDeclarationSyntax
.
的当前 XML 评论
我从 MethodDeclarationSyntax
中检索 DocumentationCommentTriviaSyntax
。由于这些对象是不可变的,因此我使用旧评论的内容创建了一个新的 DocumentationCommentTriviaSyntax
,就像使用 SyntaxFactory.DocumentationCommentTrivia
的新评论一样。然后,我为语法树创建了一个新根,使用 root.ReplaceNode
将旧的 DocumentationCommentTriviaSyntax
替换为新的 DocumentationCommentTriviaSyntax
。然后我使用这个新根创建一个新文档并 return 它。
但我似乎无法弄清楚如何添加 XML 注释(如果有 none 开头并且无法找到任何文档来帮助我。如果没有评论开头,我的 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。
我正在尝试使用 Roslyn 编译器和 Microsoft 的 CodeAnalysis API 向 C# 代码添加 XML 注释作为代码修复。到目前为止,我已经能够弄清楚如何更改 MethodDeclarationSyntax
.
我从 MethodDeclarationSyntax
中检索 DocumentationCommentTriviaSyntax
。由于这些对象是不可变的,因此我使用旧评论的内容创建了一个新的 DocumentationCommentTriviaSyntax
,就像使用 SyntaxFactory.DocumentationCommentTrivia
的新评论一样。然后,我为语法树创建了一个新根,使用 root.ReplaceNode
将旧的 DocumentationCommentTriviaSyntax
替换为新的 DocumentationCommentTriviaSyntax
。然后我使用这个新根创建一个新文档并 return 它。
但我似乎无法弄清楚如何添加 XML 注释(如果有 none 开头并且无法找到任何文档来帮助我。如果没有评论开头,我的 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。