モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

Roslyn Analyzer を作る。 [C#, Visual Studio 2015]

 さっそく内容へ

概要

  1. Roslyn とは何か
  2. なぜ Roslyn を作った?
  3. Roslyn の Analyzer とは
  4. 実際に作る
  5. 今回作ったもの
  6. まとめ

1. Roslyn とは何か

 Roslyn を知らない人のために軽く書くとすれば、簡単に言えば「次世代 .NET コンパイラー」というったところでしょうか。VBC# も対応しているところがミソです。名前空間Microsoft.CodeAnalysis

 ぐぐればわかりますが、簡単に言えば

C#/VB」―(解析)→「各々の構文木」―(最適化、IL 化)→IL

がお仕事担当です。昔のコンパイラーは DLR (Dynamic Language Runtime) 化してから IL 化していました。

2. なぜ Roslyn を作った?

 誰でも、いつでも、コンパイラー機能にアクセスできるようにするため。いわゆる

Compiler as a Service です。

 今までコンパイラーサービスに「開発者は」簡単にアクセスできなかったので、たとえばアプリケーションのスクリプト言語として C# を採用できなかったのですが、これにより可能となりました。

 また作りなおしたおかげで、今まで Visual Studioコンパイラーサービスの実装がわかれていましたが、Roslyn はインテリセンスの情報提供もできるように作られているので、最新言語の実装が早まるという効果もあるでしょう。

 ただ、このあたりの話はほかのブログとかが詳しいので、検索のキッカケになる情報だけ残しておくことにしてあとはぐぐっていただければいいかと。

3. Roslyn の Analyzer とは

 いわゆるコードリファクターのような機能を「開発者が自ら」開発できるという便利機能であります。

 たとえば、

public void Xyz()
{
    var test = "";
    this.VerifyCSharpDiagnostic(test);
}

public void Xyz()
{
    var test = string.Empty;
    this.VerifyCSharpDiagnostic(test);
}

と変更する提案機能をつけることだって可能です。

 つまり、構文木状になったものを用いてそれを解析し、それに対してフィードバックすることができる機能ということになります。

あくまでも、構文木、です。IL コードなどは触ることはできません*1

4. 実際に作る

 Visual Studio 2015 RC でインストールするものが変わっているので要注意。検索すると Preview 版ばっかりのリンクが…

以上をぶち込み、Templates > Visual C# > Extensibility > Analyzer with Code Fix (NuGet + VSIX) でプロジェクト生成。

f:id:mntone:20150616152120p:plain

 あとはサンプルを見て実装しよう!

5. 今回作ったもの

 実はもうすでに似たようなものがあります。

neuecc/NotifyPropertyChangedGenerator

 ただ自分の物を練習のために作ってみたのと、NotifyGenerateAttribute を別 Assembly 化してるという点は違います。

 また今後、構文木の解析をさらに進め、プロパティー間の依存性を追いかけ、自動で依存性を解決して通知できるようにする機能を実装予定 (実装するとは言ってない)。よければお使いください。

mntone/NotifyGenerator

 動作の様子: f:id:mntone:20150616154543g:plain

6. まとめ

 実際作ってみた感想として、

構文木へのアクセスがめんどくさい!!!

って思ったのでした… いや本当にこれは案外めんどくさいです。

 .NET Compiler Platform Syntax Visualizer for RC というのがあるのですが、これを使っても結構だるいです。まあ CodeAnalysisExtensions.cs というのを公開しているので、これを参考にいろいろ盗んで実装してもらえばいいかと思います。

 以上です。

*1:これが結構厄介な制約だったりする