C#のソースコードを読んで仕様書を作ろうの続きで実際に適当なコードをツリー化してみる。使うのはNRefactory_Demoに含まれているデモプログラムで、打ち込んだコードのパースをかけてツリーで表示できるもの。
using System; using System.Linq; class Test { public void Main(string[] args) { A a = new A(); } /// <summary>A is do simple test</summary> class A { private B _b; A() { _b = new B(); } void Test() { _b.Check(); } } /// <summary>B can check</summary> class B { void Check() { Console.WriteLine(""); } } } |
このコードを前回のようにCSharpParserでParse()すると下の画像のようなツリーになる。コメントからクラスやパラメータまで、全てがツリー状に表現されていることがわかる。namespaceなんかの定義も同様にツリー構造になるし、書かなかったけどdelegateなんかもちゃんとDeclarationとしてツリーができる。ただしツリーをみると判るがコード上省略したものはツリー上もやっぱりない。例えば最初の方にあるvoid Main()の定義であるMethodDeclarationにはModifier(publicとかprivateとか)があるが、他のクラス定義やメソッド定義ではModifierが無い。あくまでソースコードの通りにツリー化したもので、リフレクションとはまた違うのでそこは工夫が必要。とはいえ、TypeDeclarationやMethodDeclarationにはその辺を取得するプロパティがあって省略されたりしてもそのプロパティはデフォルト値が入っていたので、コード規約に沿った状態は取得できると思う。
メソッド内のコードもちゃんとツリー化されていて、変数の定義であったり式であったりで別のツリーになるし、if/else構造なんかもちゃんとIfElseStatement-true時のBlockStatement/false時のBlockStatementというツリー構造になる。
なので、気合いをいれて解析すれば仕様書を作れないこともなさそう。とりあえず、仕様書というか、構造を把握するためのアナライザ的な実装を進めてみよう♪
コメント