ReSharper 8におけるコード補完の強化
ReShaper 8においてコード補完は大幅に強化されました。このエントリではコード補完の強化ポイントを紹介いたします。
基本的なシンボルの補完
これまでインポートしていない型を補完するにはImport Completion (Shift+Alt+Space)を使う必要がありましたが、ReSharper 8では単にタイプしていくだけで補完候補に挙がるようになりました。以下のようにキャメルケースの大文字部分をタイプするだけでもしていくだけでも候補として挙げてくれます:
候補から目的のものを選択した場合、単にクラス名やインターフェース名を補完するだけでなく、ファイルの先頭に適切なネームスペース(上記の場合はSystem.ComponentModel)でusing句を配置します。
シンボルの自動補完はどこでも必要な場所で働きます。例えばコードの文脈上解決できない型をタイプした時、ReSharperは考えられる場所をすべて洗い出し、タイプのネームスペースと共に適切な候補を提示します。
加えてインポートの補完は考えられるすべての型を候補に挙げるだけでなく、拡張メソッドが適用可能であればあわせて提示します。
さらに補完候補にはコードの文脈上適用可能なスタティックメンバーやコンストラクタの呼び出しなども含まれます:
ダブルスマート補完(Double Smart Completion)
ReSharper 8ではDouble Completionと呼ばれる新しい補完の仕組みが導入されました。これはコード補完のショートカットを2回以上叩くと別の候補セットを提示するというものです。
まず、スマート補完(Ctrl+Alt+Space)から説明します。あるクラスのメソッド内でコードを書いているとします。string型の変数に代入する場合、通常の補完ではたくさんの候補が提示されます:
いくつかのメンバーはstring型を返しません!そこでスマート補完(Ctrl+Alt+Space)を使うと候補が一気に絞り込まれます:
もう一度同じショートカットを押すとメンバーをstring型にする候補を提示してくれます:
上の例ではAgeプロパティはint型ですが、ダブルスマート補完によりToString()でstring型に変換するコードを補完候補をして挙げてくれました。またGetGreeting()はstringを返すため、stringが持つメソッドのうちstring型を返すもの全て(Insert()、
Normalize()など
)も補完候補に含めています。
それだけではありません、ダブルスマート補完は無限の可能性を秘めています。補完候補の下に2xSmartと書かれていますが、もう一回ショートカットを押すと以下のようになります:
今度はもうステップ先のstringを返すメソッドやプロパティを提示してくれました。この操作は何度でも繰り返して候補を掘り下げてくことができます。
ダブルインポート補完
usingステートメントについてはどうでしょう。プロジェクトで参照している型へのコード補完については先に説明しました。しかし使いたい型が全くプロジェクトから参照されていない場合はどうでしょう?Import Completionのショートカットはこの場合役に立ちません:
しかし、もう一度ショートカットを押して”Double Import Completion”を呼び出すとプロジェクトから参照できるアセンブリを洗い出して候補としてあげてくれます:
この候補を選択した場合どうなるかは想像が付くかと思いますが、必要なアセンブリを参照するようusing句がファイル先頭に追加されます。
ダブルベーシック補完
ベーシック補完ではスマート補完、インポート補完機能が働きます。
例えば参照していない型をCtrl+Space を2回押すことで候補として表示できます:
ベーシック補完で面白いのはダブルコンプリーションを使うと通常はアクセスできないものも候補に挙げることです:
上記の例では、idというプライベートフィールドにアクセスするために修飾子をpublicかinternalに変更する必要がありますが、そのようなコードの変更は補完候補を選択した際にReSharperが自動的に行ってくれます。
キャスト補完とSender補完
コード補完の優れた点はまだまだたくさんありますが、他に特筆すべき機能が2つあります。一つはReSharperが変数の型について詳しい型情報を推論できている場合に働くキャスト補完です。以下にシンプルな例を挙げます:
上記はCtrl+Space を2回押した際に現れるダブルコンプリーションによって提示される候補です。候補の中からNameを選択するとemployeeをPerson型へキャストするコードに修正してくれます。
もう一つがSender補完です。これはイベントを生成するオブジェクトを扱う際、イベントハンドラの最初のパラメータは通常object型なので、ダブルコンプリーションによりsenderオブジェクトを必要な型にキャストした上で呼び出せるメンバを候補に挙げてくれます:
生成コード補完(Generative Completion)
ReSharperは便利なGenerateメニュー(Alt+Insert)がありますが、メニューを選ぶことなくコードを生成できたら便利なケースが多々あります。Live Templatesがその一つですが、コード補完より生成できるコードをいくつか導入しました。
一つは、メンバをoverride/implementする際、ちょっとタイプをはじめるだけでコードの補完候補が現れます:
さらに、フィールドを隠蔽したい場合などはGenerateアクションを使うかわりにプロパティ名をタイプするだけで以下のような補完候補が現れます:
上記の候補をどれか選べばread-writeやreadオンリーのプロパティを作ることができます。
最後はコンストラクタコードの自動生成です。ctorfでは全てのフィールドを、ctorpでは全てのプロパティを、ctorfpではフィールドもプロパティも初期化するコンストラクタを生成してくれます:
フォーマット指定子の補完
.NETプログラミングで辛いのがフォーマット指定子を覚えたり、都度ドキュメントを参照したりしなければならないことです。しかしReSharperを使えば簡単です!以下のように、フォーマットを行う際に文字リテラル内でコード補完が働きます:
簡単にテキストで説明されているだけでなく、実際にフォーマットした例も表示してくれるので適切なものを簡単に選ぶことができます。
この補完はDateTime、TimeSpam、Guidや数値型など、.NETの多くの標準的な型で利用できます。ToString()とstring.Format()の両方で働きます:
Odds and Ends
補完候補はタイプしているそばから、インクリメンタルに絞り込まれていきます。
また、EnterまたはTabを押した際のデフォルトの挙動を変更できるようになりました。言語やテクノロジー個別に補完を効かせるべきなのかどうか、スペースで補完を働かせるべきなのかどうか、また補完を効かせないシンボルなどを設定できます。設定はReSharper | Options | IntelliSense | Completing Charactersよりできます:
また、プリプロセッサディレクティブの利用は極力避けるべきですが、どうしても使わないといけない場合、ReSharperは以下のように助けてくれます:
条件付きコンパイルの場合は以下のようになります:
この場合補完候補は編集中のファイルに適用可能なビルドコンフィグレーションを洗い出して提示してくれます。