Как читать комментарии к документации XML с помощью Roslyn
Я хотел бы иметь возможность читать комментарии к документации XML при разборе исходного кода C# с помощью Roslyn.
/// <summary>
/// Documentation...
/// </summary>
Я пытался установить ParseDocumentationComments в ParseOptions, но, похоже, это не дает эффекта?
var parseOptions = ParseOptions.Default.WithParseDocumentationComments(true);
SyntaxTree unit = SyntaxTree.ParseFile(file, parseOptions);
3 ответа
Решение
Вам нужно будет либо:
- Посмотрите на
LeadingTrivia
синтаксиса, который содержит комментарии документа XML - Построить
Compilation
, НайтиSymbol
который имеет комментарий к документу XML и использоватьGetDocumentationComment()
метод на это.
Полный пример:
using Roslyn.Compilers.CSharp;
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var tree = SyntaxTree.ParseText(@"
/// <summary>This is an xml doc comment</summary>
class C
{
}");
var classNode = (ClassDeclarationSyntax)tree.GetRoot().Members.First();
var trivia = classNode.GetLeadingTrivia().Single(t => t.Kind == SyntaxKind.DocumentationCommentTrivia);
var xml = trivia.GetStructure();
Console.WriteLine(xml);
var compilation = Compilation.Create("test", syntaxTrees: new[] { tree });
var classSymbol = compilation.GlobalNamespace.GetTypeMembers("C").Single();
var docComment = classSymbol.GetDocumentationComment();
Console.WriteLine(docComment.SummaryTextOpt);
}
}
Просто чтобы обновить ответ Кевина Пилча выше:
Добавить Microsoft.CodeAnalysis.CSharp через Nuget
Код будет следующим:
using System; using System.Linq; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; class Program { static void Main(string[] args) { var tree = CSharpSyntaxTree.ParseText(@" /// <summary> This is an xml doc comment </summary> class C { }"); var root = (CompilationUnitSyntax) tree.GetRoot(); var classNode = (ClassDeclarationSyntax) (root.Members.First()); var trivias = classNode.GetLeadingTrivia(); var xmlCommentTrivia = trivias.FirstOrDefault(t => t.Kind() == SyntaxKind.SingleLineDocumentationCommentTrivia); var xml = xmlCommentTrivia.GetStructure(); Console.WriteLine(xml); var compilation = CSharpCompilation.Create("test", syntaxTrees: new[] {tree}); var classSymbol = compilation.GlobalNamespace.GetTypeMembers("C").Single(); var docComment = classSymbol.GetDocumentationCommentXml(); Console.WriteLine(docComment); } }
Обновить:
FirstOrDefault
метод больше не доступен. Так что используйте enumerator
вместо.
Обновленный код:
using System;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
class Program
{
static void Main(string[] args)
{
var tree = CSharpSyntaxTree.ParseText(@"
/// <summary> This is an xml doc comment </summary>
class C
{
}");
var root = (CompilationUnitSyntax) tree.GetRoot();
var classNode = (ClassDeclarationSyntax) (root.Members.First());
var trivias = classNode.GetLeadingTrivia();
var enumerator = trivias.GetEnumerator();
while (enumerator.MoveNext())
{
var trivia = enumerator.Current;
if(trivia.Kind().Equals(SyntaxKind.SingleLineDocumentationCommentTrivia))
{
var xml = trivia.GetStructure();
Console.WriteLine(xml);
}
}
}
}