月別アーカイブ: 2014年10月

Roslynを使ってみる

Roslynを使って、ソースコードの分析を試してみました。
http://msdn.microsoft.com/ja-jp/vstudio/roslyn.aspx
http://roslyn.codeplex.com/

動作環境

  • Visual Studio 2013もしくはプレビュー版のVisual Studio “14”で利用可能。
    Visual Studio 2012以前やExpress版では使用不可能(と思われる)
  • ソースコードの分析をする目的であれば、NuGetで Install-Packageを行うのみでOK。(SDKや環境拡張は入れなくても大丈夫そう)
  • 最新版(Install-Package Microsoft.CodeAnalysis -Pre)が上手く動かない場合は、古いバージョンなら動くかも(Install-Package Microsoft.CodeAnalysis -pre -version 0.7.4080704-beta)
  • Rosylnのソースコードをコンパイルするには、Visual Studio “14”が必要。
    また、workspaceオブジェクトを使うには、Visual Studio “14”が必要(もしくは”14″のBuild Toolをインストールする)。
    Windows Azure上にVisual Studio “14”インストール済みのVirtual Machineがあるので、それを使うのが一番早そう。

Roslynの学び方

ポイント

  • 以下の概念がある。詳しくはOverview参照。
    Workspace – ソリューションに対応する概念。
    Compilation – コンパイルの単位。プロジェクトに対応する。
    SemanticModel – Symbolに関する情報を保持するもの。ソースコードファイル1つに対応する。
    SyntaxTree – ソースコードの構文木。ソースコードファイル1つに対応する。
    Symbol – 名前空間、型、メソッド、プロパティ、フィールド、イベント、パラメータ、ローカル変数といった構成要素のこと。
  • SemanticModelでSymbolの情報を取得でき、SyntaxTreeでは構文の情報を取得できるので、お互いに組み合わせて分析する。
  • SyntaxNode.DescendantNodesメソッドからOfTypeメソッドやSyntaxKindで絞ることで、必要な種類の構文ノードを取得することができる。
  • (CSharp)SyntaxWalkerを継承したWalkerクラスでノードをたどることで、詳細にノードの分析をすることができる。

作成したコード

https://gist.github.com/threecourse/2c2c612646b492ae24bd

このコードで行っていることは次のとおりです。

  • 存在するソリューションから、ソリューション・プロジェクト・コンピレーションを取得する。
  • メソッド宣言の一覧を取得する
  • 各メソッドに含まれる代入式を取得し、左辺に含まれるシンボルを表示する。

変数への代入関係を確認したいソースコードがあったので、このような動作のコードを組んでみました。
Visual Studio 2013 Pro以降で、Microsoft.CodeAnalysisをInstall-Packageすれば動くはずです。