BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Roslynを使ってVisual Studioエクステンションを作る

Roslynを使ってVisual Studioエクステンションを作る

原文(投稿日:2011/10/25)へのリンク

昨日はRosylnコンパイラとWorkspace APIを紹介した。今日は、Rosyln Service APIとこのAPIを使ったVisual Studioエクステンションの作り方を紹介する。この記事では、Code Issue、Code Refactoring、Completion Provider、Outlinerの4つのエクステンションを紹介する。

他のVisual Studioエクステンションと同様、Service APIはMEFを使って登録する。つまり、開発者は単に特定のインターフェイスを実装し、MEFの属性を使えばいい。以前のVisual Studioではコード署名とCOM登録が必要だったので、この属性は歓迎された。

Code Issue

Code Issue拡張を使うと開発者は独自のコンパイラ警告やエラーを定義できる。CTPに同梱されているサンプルプロジェクトは、シンタックスに‘a’が含まれるとコンパイラが警告を出力するというものだ。下の画像の通り、この機能はVisual Studioのワークフローにしっかりと統合されている。

ICodeIssueProviderはとてもシンプルで3つのGetIssuesメソッドがあるだけだ。各メソッドはIDocumentを受け取る。このIDocumentには生のテキストファイルやシンタックスツリー、セマンティックモデル、このプロジェクトへの後方参照などの情報を含む。また、ユーザがファイルを編集して、IDEが解析を中止した場合のためにキャンセル用のトークンも保持している。

メソッドの3つのオーバーロードはそれぞれ3つのタイプのシンタックスを受け付ける。ノード、トークン、トリビアの3つだ。ほとんどの場合、ノードのレベルで分析が行われる。トリビアはコンパイラには必要ない情報、例えば、空白やコメントを表し、トークンは必要な情報を欠いている。一方ノードはトップレベルの名前空間宣言から一番小さい式まで表すことができる。

検知したエラーは、CodeIssue列挙体でIDEに返される。この列挙体はエラーの深刻度(情報、警告、エラー)とエラーの発生箇所を表すSpanオブジェクト、そしてエラーの説明で構成される。

Quick Fix

Code Issuesはひとつ以上のICodeActionオブジェクトを含む場合がある。このオブジェクトを使うと開発者は下記の画像のようなオートコレクトの選択肢を提供できるようになる。

ICodeActionを作り、ICodeActionEditと適合させるのはCode Issuesを作るより遥かに難しい。シンタックスツリーの編集してIWorkstationインターフェイス経由で公開する方法を知っていなければならないからだ。RosylnのサイトにはQuick Fixesを書くための説明が公開されている。

Code Refactoring

Code Refactoringのサポートは“quick fix”がCode Issues向けにコレクト機能を提供するのに似ている。しかし、Code Refactoringの場合はテキストレベルで適用される。ICodeRefactoringProviderにはドキュメントとTextSpanが含まれ、CodeRefactoringオブジェクトを返す。このオブジェクトはICodeActionオブジェクトのコレクションを持つ。

Code Refactoring向けのテンプレートはデモには含まれていないが、上述したQuick Fixの説明で使われている技術が適用できる。

Completion Provider

ICompletionProviderインターフェイスはGetItemsというメソッドがあるだけだ。このメソッドはIDocumentと数値型のポジションパラメータを受け取る。各CompletionItemには表示用のテキストが必要になる。アイコンや説明、代替文を含める開発者もいるだろう(insertionTextを使うか、デフォルトの表示用テキストを使う)。

使いやすさはまだ他のプロバイダに及ばないが、普通のコードスニペット環境には複雑すぎるビルドテンプレートを作るというような面白い仕掛けを作ることができる。

Outlining

最後のテンプレートのSyntax OutlinerはISyntaxOutliner経由でアクセスできる。これを使うとエディタ上に折り畳み可能なアウトラインを作成できる。ちょうど領域やクラス、メソッドで折りたたみを使うのと同じだ。このインターフェイスはシンタックスノードを受け取り、OutliningSpanオブジェクトの列挙体を返す。この列挙体には折り畳まれる領域を表すTextSpan、HintSpan(マウスオーバに反応するテキスト)、バナーテキスト、AutoCollapseオプションが含まれる。

この記事に星をつける

おすすめ度
スタイル

BT