31日間ReSharper一周 ... それIDEAでもできるよ(その8)

実は結構飽きてきたり。:-D
Day16からDay21まで延々とALT+Enterの話だったようだけど,面倒なのでまとめて話すよ。大抵のIDEがそうであるように,IDEAのALT+Enterも電球アイコンに対するアクションの発動キーとなる。電球アイコンは,以下の2つ。「こんなこともできるよ/こうしたほうが良いよ」っていうIntention/Inspection系と,エラーだから直せのQuickFix系。

#Intention/Inspection系は,うまいこと調整しないとかなりウザい。


ともかくだ。電球が出たらIDEAさまが何かを告げようとしているのだから,とりあえずALT+Enterを押してみればいい,「求めよ,されば与えられん」ってワケだ。


ついて言うと,大抵のIDEっていうのは,IDEA,NetBeansJDeveloperのことで。どうゆうわけか,Eclipseだけは,Ctrl+1にアサインされている。これって,Eclipseから乗り換えさせないための嫌がらせなのかしら?:-P

Day 16: Alt+Enterで名前空間をインポート(http://matarillo.com/resharper/day16.php

Javaだとパッケージの自動インポートでしょ。今やimport文をタイプするほうが珍しいと思うんだけど,あえてIDEAっぽい(であろう)事を挙げるならば,この2つくらいだろうか?

  • MapとかHashMapとか,あきらかに名前が被らないヤツは,電球アイコンなしで自動的にimport文が展開される。
    • それは,"Settings > Editor > Behavior > Add unambiguous imports on the fly"のお陰。
  • import文の候補に出て欲しくないパッケージ(java.awtとか)をあらかじめ指定しておける。
    • これも,"Settings > Code Completion > Exclude from Import and Completion"のお陰。

噂(?)によると,候補にあがるパッケージ一覧は選択頻度の高いモノに並び替えられるって話をどっかで聞いた気がするんだが,真意のほどは定かではない。でもね,こんな感じにListをインポートしようとすると,

  ↓
 ALT+Enter
  ↓


java.awt.Listよりjava.util.Listのほうが先に出てくるので,あながちウソじゃないと思う。

Day 17: Alt+Enterで全部修正(あと赤い電球の紹介も)(http://matarillo.com/resharper/day17.php

Day17ねぇ。そもそも,こんなコード書かないから気にもしたこと無かったんだけど,一応やってみたさ。


シンボル:fはどこにも宣言されていないので,QuickFixの赤電球が出る(この時点で,すでにウソ臭い。こんなコードわざわざ書くか?)。

ALT+Enterを押すと,QuickFixの修正候補が出てくるので,とりあえず「Rename Reference」を選ぶ。

そすっと,型が合うインスタンス変数:formが最初の候補に選ばれるってワケだ。

で,formを選んでQuickFix終了。
残りの2行も一緒に修正されちゃうので,これをReSharperのChange All相当と言っても良いんだと思う。


でもやっぱり,こんなコード書かないと思うので,あんまりありがたみを感じない(イヤ,一応ちゃんと修正に導いてくれるのは評価するよ)。
んでなんだっけ?同期編集?これは,SyncEditプラグイン入れてくれ。そうすれば,ご覧の通りだ(IdeaVIMと相性悪いから気をつけて)。

Day 18: Alt+Enterでいろいろ追加(http://matarillo.com/resharper/day18.php

うーん,特に語ることはないかな。

Day 19: Alt+Enterでメンバーを実装(http://matarillo.com/resharper/day19.php

うーん,これもイマイチ語ることはないかも。一応,IDEAでもOverride/Implementダイアログは出るよ。
 

ただこれ,ダイアログであってウィザードではないし,そんなに器用なこともしてくれない。"Copy JavaDoc"ってオプションがあって,有効にすると大元のJavadocを転記してくれるんだけど,そんなことより@{inheritDoc}を付けてくれるだけのほうが何倍もいい。


前後逆になっちゃったけど,Override/Implementダイアログの発動は,こんな感じでQuickFixの修正候補(この場合だと"Implement Methods")を選べばよい。


さりげなくIntention候補に出てる"Extend Class/Extend Class with Inner Class"は,素のIDEAの機能ではなく,Lineageプラグインによるものなので,あしからず。

Day 20: Alt+Enterでエラーや警告を修正(http://matarillo.com/resharper/day20.php

Day 21: Alt+Enterでコード変形(http://matarillo.com/resharper/day21.php

Day20とDay21は一緒にしちゃっていいダロ。IntentionとInspectionの設定をめいっぱい有効にすれば,どんなコードも電球アイコンだらけになる。Inspectionの総数は以前紹介した覚えがあるが,Intentionはまだだったはずなので,紹介しとこ。

Intentionもプラグインで追加できるので,全部でどんだけあるのかはよく知らない。とにかくたくさんあるってだけは知ってる。


で,なんだっけ?「戻り値の型の不一致」は〜,これだろ。

具象クラスの抽象メソッド」はこれかな。

それと,「割り当てられたが読み取られない変数」はこれ。

まあ,こんな感じでIntention/Inspectionを選んでいくんだけど,正直ウザい。ちょっとだけありがたいことに,選択候補の右にある三角を展開することで,その場でIntention/Inspectionを無効にすることができる。ただ,Day20でも指摘しているとおり,いったん無効にしたら山のようにあるIntention/Inspectionの一覧から探し出さないと,再度有効にすることができない。
#中には,下図の"Split into declaration and assignment"みたく,無効でも候補が出てるものもある
#ので,全部が全部ってワケではないみたい(むしろ,全部無効でも候補に出るようにして欲しい)。


話のついでにもうひとつ。Intention/Inspectionを完全に無効にするのではなく,「このクラス/このメソッド/この命令のみ無効にする」こともできる(いわゆるJSR305の走りなんだろう)。ためしに"Suppress for method"を選ぶとこうなる。

ついでに,"Suppress for statement"を選ぶとこうなる。

#なんとなく,JSR305の限界を垣間見た気がする。:-D


話を戻そう。
えーと,上から順に「読み取られるが書き込まれないフィールド」「未使用のパラメータ」「使っていない中かっこを取り除く」。

可視性の変更」はできない。一応,Modifier Modifierプラグインで似たようなことはできそうなので,お望みのかたはどぞ。
悔し紛れ(?)ではあるが,こんなのだったらできる。


んで,「変数と割り当ての分離」と「変数の割当の結合」でしょう。
 


最後が「Ifの反転」か。これは,前述した「使っていない中かっこを取り除く」のスクリーンショットに候補が載ってるので,それで許せ。
#"Invert If Condition"ってやつがそう。


このほかにも数え切れないほどのIntention/Inspectionがあるので,「それなり」に調整しないとIDEAに振り回されっぱなしになる。それに,IDEAさまの言うことを聞いたからと言ってバグが無くなるわけでもない(IDEAが検知できないモノも多い)。
うまく使いこなせば,かなり優秀なアシスタントになってくれるので,お付き合いする価値はある(ちょっとしたペアプロ気分が味わえるぞ)。


ps.
あーそうそう,IDEAの場合は,エラーの移動は"F2 (Next Highlighted Error)"ね。それと,NetBeansEclipseみたくエラーの一覧はどこにも表示されないので,探しても無駄だよ。