3

免責事項

明らかな何かが欠けていることは確かですが、公式のドキュメントを読んだ後でも、Roslynが構文ツリーを作成する方法を明確に理解していません。

次の単純なコードについて考えてみます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace aopsample
{
    
    class UsbReadWriter
    {
       
        public bool ReadFromUsb()
        {
            return true;
        }

        public virtual bool WriteToUsb()
        {
            return true;
        }
    }
}

SyntaxTreeはこのコードのためにを取得し、このようなものを非常にラフでシンプルに作成しますが、理解する必要があります。

 

  string[]lines =  System.IO.File.ReadAllLines(filename);      
  string tocompile = string.Join(string.Empty, lines);  

  SyntaxNode root = tree.GetRoot(new CancellationToken());
  foreach (SyntaxNode sn in root.ChildNodes())
  {
      if (sn.Kind == SyntaxKind.NamespaceDeclaration)
      {
         //I get a namespace, so it's Child node just will be class
         foreach (SyntaxNode sname in sn.ChildNodes())
         {
             if (sname.Kind == SyntaxKind.ClassDeclaration)
             {
                 //I get class, so it's  Children will be methods of the class        
                 foreach (SyntaxNode sclass in sname.ChildNodes()) // **{1}** 
                 {
                     if (sclass.Kind == SyntaxKind.MethodDeclaration) 
                     {
                        
                     }
                 }
             }
        }

そして、それはかなりうまく機能します。

問題

ただし、 ReadFromUsb()メソッドにコメントを追加するだけで、次のようになります。

/// <summary>
/// Reads a data from Usb
/// </summary>
/// <returns></returns>
public bool ReadFromUsb()
{
    return true;
}

そしてChildNodes()、{1}マークの付いた行を呼び出します。CLASS(???)は0を返します。

質問

メンバー関数にコメントを追加すると、親のCLASS子の構文ノードのコレクションがリセットされるのはなぜですか?

私は何が欠けていますか?

4

3 に答える 3

11

チャットでの議論に続いて、解析するコードが次のように構築されていることが問題であると判断しました。

string[]lines = System.IO.File.ReadAllLines(filename); 
string tocompile = string.Join(string.Empty, lines);

これにより、すべてのコードが 1 行にまとめられます。したがって、以降はすべて//コメントになります。解決策はEnvironment.NewLine、結合文字として使用するか、ReadAllText代わりに使用することですReadAllLines

于 2011-12-30T22:24:31.210 に答える
3

コメントはソース コードのどこにでも表示できるChildNodeため、真の構文要素用に予約されている としてモデル化されていません。代わりに、それらは考慮されSyntaxTriviaます。LeadingTriviaあなたの例では、メソッドを見てコメントを見ることができるはずです。

GetStructure()さらに、これは独自の興味深い構造を持つ XML doc コメントであるため、 のメソッドで取得できる独自の小さなツリーとしてモデル化されますSyntaxTrivia

于 2011-12-30T21:32:48.917 に答える