2013-04-02 23 views
19

Tôi muốn đọc các nhận xét tài liệu XML trong khi phân tích mã nguồn C# bằng Roslyn.Cách đọc các nhận xét tài liệu XML bằng cách sử dụng Roslyn

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

Tôi đã thử đặt ParseDocumentationComments trong ParseOptions, nhưng dường như nó không có hiệu lực?

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

Bạn đang cố gắng để đọc các ý kiến ​​XML chính xác? – user7116

Trả lời

25

Bạn sẽ cần một trong hai:

  1. Nhìn vào LeadingTrivia của cú pháp có chứa doc XML bình luận
  2. Xây dựng một Compilation, tìm Symbol có những nhận xét XML doc và sử dụng phương pháp GetDocumentationComment() trên đó.

Một ví dụ hoàn chỉnh:

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); 
    } 
} 
+8

omg roslyn u kick ass – CRice

+0

OP cho một ví dụ về nhận xét nhiều dòng. Tôi có cùng một vấn đề. Bất kỳ cơ hội nào bạn có thể viết lại mã của mình để minh họa cách đọc nhận xét tài liệu nhiều dòng (theo câu hỏi gốc)? –

+0

Đối với trường hợp 'Symbol', nó phải giống hệt nhau. Đối với trường hợp cú pháp, bạn sẽ chỉ nhìn vào 'MultiLineDocumentationCommentTrivia' –

4

Chỉ cần cập nhật Kevin Pilch answer above:

  1. Thêm Microsoft.CodeAnalysis.CSharp qua NuGet

  2. Mã sẽ như sau:

    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); 
        } 
    } 
    
+0

Thêm" Microsoft.CodeAnalysis.CSharp "là rất quan trọng. Nếu không, phương thức t.Kind() sẽ không hoạt động! –

1

Cập nhật:

FirstOrDefault phương pháp là không còn nữa. Vì vậy, hãy sử dụng enumerator để thay thế.

Cập nhật mã:

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); 
      } 
     } 
    } 
}