NetBeansには、Jackpotという言語クエリーエンジンが載っているという噂がありました。でも新機能として紹介されるでもなく、なんかもしかしたら使えるのかなーという感じですっかり忘れていたところ、今回のJavaOneで紹介があって、試してみたら超便利だったので、使い方を紹介します。
Jackpotのスクリプトは、クラスパス上のMETA-INF/upgradeにhintという拡張子でファイルを作るか「検査と変換」の「単一の検査」のところの「参照」から開ける「検査の管理」で「新規」を選ぶことで作成できます。
ただし、「検査の管理」で作成すると埋め込まれてる
<!description="Empty Inspection">
という行の処理がうまくいってないようで、この記述を消す必要があります。
このせいで、今まで何度ためしてもうまくいってませんでした。。。
それでは、試しに「foo == null ? bar + 1 : bar」のように同じ値が2回でてくるような条件演算子を「bar + (foo == null ? 1 : 0)」のように変換するスクリプトを作ってみます。
ここでは、META-INF/upgradeにhintファイルを作ってみます。
内容としてはこんな感じ。
$cond ? $a + $b : $a => $a + ($cond ? $b : 0) ;;
だいたいの文法はこんな感じですね。
元の式 => 変換後の式 ;;
詳しい文法はこちら
jlahoda / jackpot30 / wiki / RulesLanguageAdditionalDocs ― Bitbucket
こういうファイルを作ると、リアルタイムにエディタ上のヒントがでてきます。
一括して変換する場合は、「検査と変換」で「プロジェクトのクラスパスから」というところから選べます。
他にも、次のようにしてLinkedListを葬り去ったりできます。
<? import java.util.ArrayList; import java.util.LinkedList; ?> new LinkedList() => new ArrayList() ;; $mod$ LinkedList $0 => $mod$ ArrayList $0 ;; $mod$ LinkedList $0 = $1; => $mod$ ArrayList $0 = $1; ;;
単純に
java.util.LinkedList => java.util.ArrayList ;;
とやると、import java.util.LinkedListがimport ArrayListに変換されてちょっと雑なので、いろいろちゃんと書いています。
あとは、GuavaのList.newArrayListを葬るとか。
com.google.common.collect.Lists.newArrayList() => new java.util.ArrayList<>() ;;
こういった、外部ライブラリに対応したリファクタリングは標準機能としては用意されないので、簡単なものが自分で作れるというのは便利です。
新しいライブラリの導入時とかに結構便利そうです。
プロジェクトサイト
Jackpot - NetBeans Wiki
開発者のインタビュー
Interview with Tom Ball
ライブデモ
Jackpot in NetBeans with Michael Nascimento - YouTube