2017-01-09 28 views
1

RoslynコンパイラとMicrosoftのCodeAnalysis APIを使用してコードコメントとしてXMLコメントをC#コードに追加しようとしています。これまで私はMethodDeclarationSyntaxの現在のXMLコメントを変更する方法を理解することができました。Roslynを使用してMethodDeclarationSyntaxノードにXMLコメントを追加する方法は?

MethodDeclarationSyntaxからDocumentationCommentTriviaSyntaxを取得します。これらのオブジェクトは不変なので、私はSyntaxFactory.DocumentationCommentTriviaを使って新しいコメントとして、私の古いコメントの内容を新しいDocumentationCommentTriviaSyntaxにします。次に、構文木の新しいルートを作成して、私の古いDocumentationCommentTriviaSyntaxを新しいものに置き換えて、root.ReplaceNodeを使用します。次に、この新しいルートを使用して新しい文書を作成し、それを返します。

しかし、最初に何も書かれていない場合や、私に役立つドキュメントが見つからない場合は、XMLコメントを追加する方法を理解できないようです。開始するコメントがない場合、私のDocumentationCommentTriviaSyntaxはnullであり、ReplaceNodeはエラーを投げます。

誰かが正しい方向に向かうことができますか?私は事前に助けていただきありがとうございます!

答えて

1

MethodDeclarationSyntaxを変更してReplaceNodeを呼び出す必要があります。

var testDocumentation = SyntaxFactory.DocumentationCommentTrivia(
    SyntaxKind.SingleLineDocumentationCommentTrivia, 
    SyntaxFactory.List<XmlNodeSyntax>(
     new XmlNodeSyntax[]{ 
      SyntaxFactory.XmlText() 
      .WithTextTokens(
       SyntaxFactory.TokenList(
        SyntaxFactory.XmlTextLiteral(
         SyntaxFactory.TriviaList(
          SyntaxFactory.DocumentationCommentExterior("///")), 
         " ", 
         " ", 
         SyntaxFactory.TriviaList()))), 
      SyntaxFactory.XmlElement(
       SyntaxFactory.XmlElementStartTag(
        SyntaxFactory.XmlName(
         SyntaxFactory.Identifier("summary"))), 
       SyntaxFactory.XmlElementEndTag(
        SyntaxFactory.XmlName(
         SyntaxFactory.Identifier("summary")))) 
      .WithContent(
       SyntaxFactory.SingletonList<XmlNodeSyntax>(
        SyntaxFactory.XmlText() 
        .WithTextTokens(
         SyntaxFactory.TokenList(
          SyntaxFactory.XmlTextLiteral(
           SyntaxFactory.TriviaList(), 
           "test", 
           "test", 
           SyntaxFactory.TriviaList()))))), 
      SyntaxFactory.XmlText() 
      .WithTextTokens(
       SyntaxFactory.TokenList(
        SyntaxFactory.XmlTextNewLine(
         SyntaxFactory.TriviaList(), 
         "\n", 
         "\n", 
         SyntaxFactory.TriviaList())))})); 

を...そして私たちはドキュメントを追加するpublic static void Main()方法があります:

それでは、私たちは次のドキュメントのトリビアを持っているとしましょう。これは、すでに雑学(必ずしも必要ではないが)持っている:私たちはそのリストの最初のトークンのコンテンツをラップする必要が

SyntaxFactory.TokenList(
    new []{ 
     SyntaxFactory.Token(SyntaxKind.PublicKeyword), 
     SyntaxFactory.Token(SyntaxKind.StaticKeyword)})); 

(私はプログラム的に行うためにあなたにそれを残しておきますが...)新しいトリビアのリストに:

var newMethodNode = oldMethodNode.WithModifiers(
    SyntaxFactory.TokenList(
     new []{ 
      SyntaxFactory.Token(
       SyntaxFactory.TriviaList(
        SyntaxFactory.Trivia(testDocumentation)), // xmldoc 
        SyntaxKind.PublicKeyword, // original 1st token 
        SyntaxFactory.TriviaList()), 
      SyntaxFactory.Token(SyntaxKind.StaticKeyword)})) 

root.ReplaceNode (oldMethodNode, newMethodNode); 

構成するトリビアを正確に理解するには、RoslynQuoterを使用してください。

+1

ありがとうございました!これは非常に有用でした – ddresner8

関連する問題