我正在尝试使用Roslyn编译器和Microsoft的CodeAnalysis API将XML注释添加到C#代码作为代码修复。到目前为止,我已经能够弄清楚如何更改MethodDeclarationSyntax
的当前XML注释。
我从DocumentationCommentTriviaSyntax
检索MethodDeclarationSyntax
。由于这些对象是不可变的,因此我使用DocumentationCommentTriviaSyntax
创建一个新的SyntaxFactory.DocumentationCommentTrivia
,其中包含旧评论的内容。然后,我为语法树创建了一个新的根,使用DocumentationCommentTriviaSyntax
替换旧的root.ReplaceNode
。然后我使用这个新根创建一个新文档并返回它。
但是我似乎无法弄清楚如果没有任何内容可以添加XML注释,并且无法找到任何文档来帮助我。如果没有评论开头,我的DocumentationCommentTriviaSyntax
为空,ReplaceNode
会引发错误。
有人能指出我正确的方向吗?我提前感谢你的帮助!
答案 0 :(得分: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。