24

Roslyn を使用して C# ソース コードを解析しながら、XML ドキュメントのコメントを読み取れるようにしたいと考えています。

/// <summary>
/// Documentation...
/// </summary>

ParseOptions で ParseDocumentationComments を設定してみましたが、効果がないようですか?

var parseOptions = ParseOptions.Default.WithParseDocumentationComments(true);
SyntaxTree unit = SyntaxTree.ParseFile(file, parseOptions);
4

3 に答える 3

33

次のいずれかを行う必要があります。

  1. LeadingTriviaXML doc コメントを含む構文を見てください。
  2. を構築し、XML doc コメントを持つ をCompilation見つけて、メソッドを使用します。SymbolGetDocumentationComment()

完全な例:

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);
    }
}
于 2013-04-02T15:52:37.423 に答える
7

上記のKevin Pilchの回答を更新するだけです:

  1. ナゲット経由で Microsoft.CodeAnalysis.CSharp を追加します

  2. コードは次のようになります。

    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);
        }
    }
    
于 2017-07-12T14:29:56.800 に答える