C# 如何在Roslyn中将XML文档注释添加到ClassDeclarationSyntax中?
我有一些构建类的代码:C# 如何在Roslyn中将XML文档注释添加到ClassDeclarationSyntax中?,c#,.net,visual-studio-2015,roslyn,C#,.net,Visual Studio 2015,Roslyn,我有一些构建类的代码: return SyntaxFactory .ClassDeclaration(name) .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)) .WithMembers(GetProperties()); 这一切都有效,并输出我所期望的类。我想在此添加一个XML文档: /// <summary> /// Some plain text here. /// </s
return SyntaxFactory
.ClassDeclaration(name)
.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
.WithMembers(GetProperties());
这一切都有效,并输出我所期望的类。我想在此添加一个XML文档:
/// <summary>
/// Some plain text here.
/// </summary>
//
///这里有一些纯文本。
///
我不需要任何花哨的东西,只要纯文本。我正在努力寻找这方面的任何例子,并且已经经历了各种各样的注释
,琐事
,以及悬挂在语法工厂
(xmlcoment
,xmlementstarttag
,documentationcommentexternal
,DocumentationCommentTrivia
)毫无乐趣(讽刺的是,这些都没有XML注释!)。我得到的最接近的东西是编译过的,但在运行时崩溃了,出现了意外的false
我的目标是.NET 4.5,使用Roslyn的VS 2015 RC和1.0.0-rc2。您可以使用了解如何做到这一点:
SyntaxFactory.ClassDeclaration(
@"C")
.WithKeyword(
SyntaxFactory.Token(
SyntaxFactory.TriviaList(
SyntaxFactory.Trivia(
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(
new []{
SyntaxFactory.XmlTextNewLine(
SyntaxFactory.TriviaList(),
@"
",
@"
",
SyntaxFactory.TriviaList()),
SyntaxFactory.XmlTextLiteral(
SyntaxFactory.TriviaList(
SyntaxFactory.DocumentationCommentExterior(
@"///")),
@" Some plain text here.",
@" Some plain text here.",
SyntaxFactory.TriviaList()),
SyntaxFactory.XmlTextNewLine(
SyntaxFactory.TriviaList(),
@"
",
@"
",
SyntaxFactory.TriviaList()),
SyntaxFactory.XmlTextLiteral(
SyntaxFactory.TriviaList(
SyntaxFactory.DocumentationCommentExterior(
@"///")),
@" ",
@" ",
SyntaxFactory.TriviaList())})))),
SyntaxFactory.XmlText()
.WithTextTokens(
SyntaxFactory.TokenList(
SyntaxFactory.XmlTextNewLine(
SyntaxFactory.TriviaList(),
@"
",
@"
",
SyntaxFactory.TriviaList())))})))),
SyntaxKind.ClassKeyword,
SyntaxFactory.TriviaList()))))
SyntaxFactory.ClassDeclaration(
@“C”)
.WithKeyword(
符号工厂(
平凡主义者(
合成工厂,琐事(
SyntaxFactory.DocumentationCommentTrivia(
SyntaxKind.SingleLineDocumentationCommentTrivia,
合成工厂列表(
新XmlNodeSyntax[]{
SyntaxFactory.XmlText()
.使用文本令牌(
SyntaxFactory.TokenList(
SyntaxFactory.XmlTextLiteral(
平凡主义者(
SyntaxFactory.DocumentationCommentExterior(
@"///")),
@" ",
@" ",
SyntaxFactory.Trialiist()),
SyntaxFactory.XmlElement(
SyntaxFactory.XmlElementStartTag(
SyntaxFactory.XmlName(
SyntaxFactory.Identifier(
@"摘要"),,
SyntaxFactory.XmlElementEndTag(
SyntaxFactory.XmlName(
SyntaxFactory.Identifier(
@"摘要")
.带内容(
SyntaxFactory.SingletonList(
SyntaxFactory.XmlText()
.使用文本令牌(
SyntaxFactory.TokenList(
新[]{
SyntaxFactory.XmlTextNewLine(
SyntaxFactory.Tripleist(),
@"
",
@"
",
SyntaxFactory.Trialiist()),
SyntaxFactory.XmlTextLiteral(
平凡主义者(
SyntaxFactory.DocumentationCommentExterior(
@"///")),
@“这里有一些纯文本。”,
@“这里有一些纯文本。”,
SyntaxFactory.Trialiist()),
SyntaxFactory.XmlTextNewLine(
SyntaxFactory.Tripleist(),
@"
",
@"
",
SyntaxFactory.Trialiist()),
SyntaxFactory.XmlTextLiteral(
合成税工厂.平凡主义者(
SyntaxFactory.DocumentationCommentExterior(
@"///")),
@" ",
@" ",
SyntaxFactory.Trialiist()}),
SyntaxFactory.XmlText()
.使用文本令牌(
SyntaxFactory.TokenList(
SyntaxFactory.XmlTextNewLine(
SyntaxFactory.Tripleist(),
@"
",
@"
",
SyntaxFactory.Trialiist())}),
SyntaxKind.ClassKeyword,
SyntaxFactory.Trialiist())
试试这个:
var doc = @"
/// <summary>
/// Some plain text here.
/// </summary>
";
return SyntaxFactory.Comment(doc);
var doc=@”
///
///这里有一些纯文本。
///
";
返回SyntaxFactory.Comment(文档);
以下是我最后做的事情:
var tokens = docText.Split('\n')
.Select(line => XmlTextLiteral(line))
.ToList();
for(int i = 1; i < tokens.Count; i += 2)
tokens.Insert(i, XmlTextNewLine("\n"));
var summary = XmlElement("summary",
SingletonList<XmlNodeSyntax>(XmlText(TokenList(tokens))));
SyntaxTriviaList doc = TriviaList(
Trivia(DocumentationComment(summary, XmlText("\n"))));
return member.WithLeadingTrivia(doc);
var-tokens=docText.Split('\n')
.选择(行=>XmlTextLiteral(行))
.ToList();
for(int i=1;ipublic static class XmlComments
{
private static TMember AddSimple<TMember>(this TMember member,XmlElementSyntax xmlElement) where TMember:MemberDeclarationSyntax
{
return member.WithLeadingTrivia(
TriviaList(
Trivia(
DocumentationComment(
xmlElement,
XmlText().WithTextTokens(
TokenList(
Token(
TriviaList(),
SyntaxKind.XmlTextLiteralNewLineToken,
Environment.NewLine,
Environment.NewLine,
TriviaList()
)
)
)
)
)
)
);
}
public static PropertyDeclarationSyntax AddValue(this PropertyDeclarationSyntax property,string value)
{
return property.AddSimple(
XmlValueElement(
XmlText(value)
));
}
public static TMember AddSummary<TMember>(this TMember member, string value) where TMember: MemberDeclarationSyntax
{
return member.AddSimple(
XmlSummaryElement(
XmlText(value)
));
}
}