matarillo.com

The best days are ahead of us.

31日間ReSharper一周 Day 17: Alt+Enterで全部修正(あと赤い電球の紹介も)

2012-12-30 18:17:12

元記事

31日間ReSharper一周」の17日目にようこそ。

数日間続けてAlt+Enterをネタにする。今日のネタはAlt+Enter > Change All の利用だ。

赤い電球

最初に言っておきたいのは、昨日の機能(Alt+Enterで名前空間をインポートする)は、たとえどこにカーソルがあっても動作する点が特殊だということだ。Alt+Enterがそういう動作をするのは名前空間だけなんだ。通常は位置との関係性が強くて、現在カーソルがあるコードに対してだけ作用する。これからネタにしていくAlt+Enterの機能は全部そうなっている。

ReSharperが修正方法を知っている問題(赤や灰色や波線)があったとき、カーソルを問題のコードに持ってくれば、ReSharperはその行の隣に赤い電球を表示する。

赤い電球。Alt+Enterで修正できる問題を示す。

赤い電球は、何かを修正しなければならないことを示している。黄色の電球も存在する。こっちの場合、修正してもいいけど全ては自分の判断に任されている。こっちは後日の投稿でネタにしよう。

電球はクリックしてもいいし、Alt+Enterを押してもいい。どちらの方法でも、エラーを修復する方法の選択肢がドロップダウンメニューで表示される。

Alt+Enterのドロップダウンメニュー。コンパイルエラーを修正するChange Allなどの選択肢を表示する。

追記: このドロップダウンメニューのコマンドは「応急処置」と呼ばれている。(最初に投稿したときに言及しておけばよかったね。)

Change Allについて

赤いシンボルのための応急処置のうちの1つがChange Allだ。これは名前から連想される通りのことをする。全ての(赤い)シンボルを、別の(定義済みで赤くない)シンボルに変える。これが便利なのは、たとえば、あるメソッドからコードを切り取って別のメソッドにコピーするときに、変数またはパラメータ名が違っている場合だ。

Change Allには2つの部分がある。提案リストと同期編集だ。

提案リスト:読心術稼働中

Change Allコマンドの提案リスト

Change Allを選ぶと提案リストが表示される。しばしば提案が1つしかなく、それがまさに希望のものだったりする。便利すぎて気味が悪い。

今この機能について書きながら、どう動くのか正確に理解しようとして限界を試しているんだが、改めて感心した。この機能は基本的にはCtrl+Shift+Spaceの裏返しだ。

何が起きているかと言うと、シンボルが赤く表示されている場所を全部見て、(同名の赤くないシンボルを持つメソッドは全部無視して、)各々の場所でどのように使われているかを知り、エラーのない利用法に沿ったシンボルを提案している。

だから、もしシンボルがif文の条件式なら、ReSharperはbool型の変数だけを提案する。もしシンボルの後に「.PixelOffsetMode =」とあるなら、ReSharperはGraphics型の変数だけを提案する。(別の型にPixelOffsetModeプロパティを定義していなければね。)

多くの場合、シンボルの使い方に合致した、ただ1つのパラメータまたはプロパティになる。だからReSharperが心を読んでいるかのように見える。(そう言っても過言ではない!)

注意点:Change Allの提案リストは、変数のようなもの(変数やパラメータやプロパティ)を対象とする。メソッド名や型名にもChange Allを使うことができるけど、Change Allのリストにはそれらの提案が出ない。

同期編集がVisual Studioにやって来た

これは素晴らしい感触だ。新しい名前を入力するダイアログボックスをポップアップする代わりに、Change Allではエディタ上の1箇所で直接新しい名前を入力できて、入力したとおりに他のところを変えることができる。

ReSharperのドキュメントにはこの「エディタウィンドウの指定場所でリネームする」機能に名前がない。でもこれはDelphi 2005の同期編集機能とほぼ同じもののようだから、そう呼ぶことにする。Visual Studioでこの機能が利用できてうれしい。


31日間ReSharper一周 インデックスへ戻る