Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KanColleViewer PluginAnalyzer の実装

veigr
September 16, 2015

KanColleViewer PluginAnalyzer の実装

Metro.cs #1 https://roommetro.doorkeeper.jp/events/30482 のセッション資料。
* KanColleViewer で Roslyn を使うに至った理由と、Roslyn の意義 👈 https://speakerdeck.com/grabacr07/roslyn-plus-kancolleviewer
* KanColleViewer で使ったアナライザー実装の解説 👈 この資料

veigr

September 16, 2015
Tweet

More Decks by veigr

Other Decks in Programming

Transcript

  1. Self Introduction ゔぇい Work 小さな独立系 SIer (C# + WPF +

    ASP .NET WebAPI とか) Private 提督業も忙しい! (KanColleViewer) 開発メンバー (Plugin Analyzer / Network 等) 同プラグイン開発 Nekoxy (艦これ向け HTTP プロキシライブラリ) 開発 Twitter: @veigr Blog: http://www.cat-ears.net
  2. KanColleViewer.PluginAnalyzer プラグイン開発支援用 Roslyn Analyzer 目的: プラグイン開発特有の実装ルールを守らせる • 実装しなければならない Interface •

    Interface に対応した ExportAttribute の実装 • 本体が要求する Metadata の実装 ソース: https://github.com/Grabacr07/KanColleViewer/tree/develop/source/Analyzers
  3. 参考になるやつ Roslyn Overview · dotnet/roslyn Wiki https://github.com/dotnet/roslyn/wiki/Roslyn%20Overview Samples and Walkthroughs

    · dotnet/roslyn Wiki https://github.com/dotnet/roslyn/wiki/Samples-and-Walkthroughs neuecc さんとか岩永さんとかの Blog や成果物 色々あるのでググろう
  4. 作った Anaylzer の利用 Analyzer インストール方法 • DLL を参照追加してインストール • NuGet

    パッケージにしてインストール • VSIX にしてインストール ※プロジェクト参照はできないっぽい ※Analyzer が依存している外部アセンブリがあるとちょっと面倒
  5. DiagnosticsAnalyzer 何を ReportDiagnostic するか…… DiagnosticDescriptor の内容 DiagnosticId : 「エラー一覧」の「コード」とかに出てくるID ExportMetadataMessageFormat

    : リソースファイルでお好きなメッセージをどうぞ Category : Analyzer の一覧のグループ化あたりで使う名前 DiagnosticSeverity : エラーレベル / Error のが残っているとコンパイルできなくなる
  6. CodeFixProvider どう解析結果を受け取るか…… • CodeFixContext からはエラーの位置くらいしかもらえない • だがその位置から問題のある ClassDeclaration は探せる •

    解析の時は ClassDeclaration を使って不足属性を検出した • なら解析の時と同じことをもう一度やればいい!
  7. CodeFixProvider Task<Document> の作り方 1. 元 Document (ソースコード)を CodeFixContext から取得 2.

    SyntaxFactory で新たな SyntaxTree を構築 3. 構築した SyntaxTree で問題の箇所を置換 4. 置換した Document を返す
  8. CodeFixProvider Task<Document> の作り方 2. SyntaxFactory で新たな SyntaxTree を構築 ※あらゆる Syntax

    は immutable なので、常に新たなインスタンスを生成するようなコードにしな ければならない点に注意