JavaParserを使ってみる
Javaのコードレビューをしていて、指摘事項の水平展開をする時に、エディタ等のgrepで検索して、類似の指摘箇所を探したりします。 ただ、それだと、複数行にまたがり相関をもった内容の抽出に手間がかかります。
例えば、前のプロジェクトでは、stream処理の中に、さらにstream処理を使っているケースでは、可読性が著しく下いコードがたくさんありました。当初は、一律禁止するつもりはなかったのですが、一律禁止することにしました。禁止するので、このルールが守られているかチェックが必要になり、grepでソースコードの当たりをつけて、その前後を目視確認する作業に手間がかかってしまいました。
なんらかのツールをカスタマイズすればよかったのですが、カスタマイズのルールを学ぶのが面倒だったので、結局、grep+目視をしていました。
結局、込み入ったチェックやプロジェクトのルールに従っていることをチェックをするには、Javaのソースコードをパースするしかありません(というか、各種ツールもパースしてますが)。
そこで、次回に活かせるようにJavaのソースコードをパースの練習をしてみました。
パーサーはJavaParserが良さそうだったので、使ってみました。基本的な使い方は、
- ソースコードを読み込み、
- Visitorを適用するだけです。
- 各種ノードに対するドメソッドがたくさん用意されているので、それをオーバーライド実装するだけです。
Visitorパターンなので、同じノードでも階層が異なった時の対処が面倒くさいのですが。
最初はどのようなノード構造になっているかわからないので、
- いったんパースした後のノードを全部出力しておく
- ツリーを出力しておく
と良いと思います。
下のコード例では、
- ノード全体の出力(デバッック用)
- ツリーをJSONとして表示(デバッック用)
- メソッドの行数(練習)
- forEachのなかにforEachがある部分(前のプロジェクトでチェックしたかった箇所)
を出力しています。
いろいろできると思います。
- 長いラムダ式を抽出
- 嘘をついている変数名の抽出(例、Mapなのに変数名がListとなっている)
- コメントだけを抜き出して、文章をチェックするとか(オフショア案件の時)