2013-04-02 16 views
19

Chciałbym móc czytać komentarze dokumentacji XML podczas analizowania kodu źródłowego C# za pomocą Roslyn.Jak czytać komentarze dokumentacji XML za pomocą Roslyn

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

Próbowałem ustawienie ParseDocumentationComments w ParseOptions, ale nie wydaje się mieć wpływ?

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

Jak próbujesz przeczytać komentarze XML dokładnie? – user7116

Odpowiedz

25

Musisz albo:

  1. Spójrz na LeadingTrivia składni, który zawiera dokument XML komentarze
  2. Narysuj Compilation znajdź Symbol który ma komentarz XML i doc użyj na nim metody GetDocumentationComment().

Kompletny przykład:

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 podaje przykład komentarza wielowierszowego. Mam ten sam problem. Czy istnieje szansa, że ​​możesz ponownie napisać swój kod, aby pokazać, jak odczytać komentarz do wielowierszowej dokumentacji (zgodnie z pierwotnym pytaniem)? –

+0

Dla przypadku "Symbol" powinno być identyczne. W przypadku składni, wystarczy spojrzeć na 'MultiLineDocumentationCommentTrivia' –

4

Wystarczy zaktualizować Kevin Pilch answer above:

  1. Dodaj Microsoft.CodeAnalysis.CSharp poprzez Nuget

  2. kod będzie wyglądał następująco:

    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

Dodawanie" Microsoft.CodeAnalysis.CSharp "jest bardzo ważne. W przeciwnym razie metoda t.Kind() nie będzie działać! –

1

Aktualizacja:

FirstOrDefault metoda nie jest już dostępny. Więc użyj zamiast tego enumerator.

Zaktualizowany kod:

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); 
      } 
     } 
    } 
} 
Powiązane problemy