2013-04-02 4 views
19

Я хотел был бы иметь возможность прочитать комментарии документации XML во время разбора исходного кода C# с использованием Roslyn.Как читать комментарии к документации по XML с использованием Roslyn

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

Я попытался установить ParseDocumentationComments в ParseOptions, но это, кажется, не имеют эффекта?

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

Как вы пытаетесь прочитать комментарии XML именно? – user7116

ответ

25

Вам нужно либо:

  1. Посмотрите на LeadingTrivia синтаксиса, который содержит XML-документ комментарии
  2. Построить Compilation, найти Symbol, который имеет XML DOC комментарий и используйте метод 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); 
    } 
} 
+8

omg roslyn u kick ass – CRice

+0

OP дает пример многострочного комментария. У меня такая же проблема. Вы можете переписать код, чтобы продемонстрировать, как читать многострочный комментарий к документации (в соответствии с исходным вопросом)? –

+0

Для случая «Символ» он должен быть идентичным. Для случая синтаксиса вы просто посмотрите на 'MultiLineDocumentationCommentTrivia' –

4

Просто обновить Kevin Pilch answer above:

  1. Добавить Microsoft.CodeAnalysis.CSharp через NuGet

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

Добавление« Microsoft.CodeAnalysis.CSharp »очень важно. В противном случае метод t.Kind() не будет работать! –

1

Update:

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

 Смежные вопросы

  • Нет связанных вопросов^_^