27

I would like to be able to read XML documentation comments while parsing C# source code using Roslyn.

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

I tried setting the ParseDocumentationComments in the ParseOptions, but it doesn't seem to have an effect?

var parseOptions = ParseOptions.Default.WithParseDocumentationComments(true);
SyntaxTree unit = SyntaxTree.ParseFile(file, parseOptions);
svick
  • 236,525
  • 50
  • 385
  • 514
Bjorn Reppen
  • 22,007
  • 9
  • 64
  • 88

3 Answers3

35

You'll need to either:

  1. Look at the LeadingTrivia of the syntax that contains the XML doc comments
  2. Construct a Compilation, find the Symbol that has the XML doc comment and use the GetDocumentationComment() method on it.

A complete example:

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);
    }
}
Kevin Pilch
  • 11,485
  • 1
  • 39
  • 41
  • The OP gives an example of a multiline comment. I have the same issue. Any chance you could re-write your code to demonstrate how to read a multiline documentation comment (as per the original question)? – Quark Soup Aug 24 '15 at 20:35
  • For the `Symbol` case, it should be identical. For the syntax case, you would just look at the `MultiLineDocumentationCommentTrivia` – Kevin Pilch Aug 25 '15 at 20:06
  • I think `GetDocumentationComment` has since been replaced with `GetDocumentationCommentXml` – Jack Ukleja May 12 '16 at 08:00
7

Just to update Kevin Pilch answer above:

  1. Add Microsoft.CodeAnalysis.CSharp via nuget

  2. Code will be as follows:

    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);
        }
    }
    
Anton Krouglov
  • 3,077
  • 2
  • 29
  • 50
2

Update :

FirstOrDefault method is no longer available. So use enumerator instead.

Updated code :

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);
           }
        }
    }
}
Utsav Chokshi
  • 1,357
  • 1
  • 13
  • 35