IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

JavaParserを使ってみる

Javaのコードレビューをしていて、指摘事項の水平展開をする時に、エディタ等のgrepで検索して、類似の指摘箇所を探したりします。 ただ、それだと、複数行にまたがり相関をもった内容の抽出に手間がかかります。

例えば、前のプロジェクトでは、stream処理の中に、さらにstream処理を使っているケースでは、可読性が著しく下いコードがたくさんありました。当初は、一律禁止するつもりはなかったのですが、一律禁止することにしました。禁止するので、このルールが守られているかチェックが必要になり、grepソースコードの当たりをつけて、その前後を目視確認する作業に手間がかかってしまいました。

なんらかのツールをカスタマイズすればよかったのですが、カスタマイズのルールを学ぶのが面倒だったので、結局、grep+目視をしていました。

結局、込み入ったチェックやプロジェクトのルールに従っていることをチェックをするには、Javaソースコードをパースするしかありません(というか、各種ツールもパースしてますが)。

そこで、次回に活かせるようにJavaソースコードをパースの練習をしてみました。

パーサーはJavaParserが良さそうだったので、使ってみました。基本的な使い方は、

  • ソースコードを読み込み、
  • Visitorを適用するだけです。
  • 各種ノードに対するドメソッドがたくさん用意されているので、それをオーバーライド実装するだけです。

Visitorパターンなので、同じノードでも階層が異なった時の対処が面倒くさいのですが。

最初はどのようなノード構造になっているかわからないので、

  • いったんパースした後のノードを全部出力しておく
  • ツリーを出力しておく

と良いと思います。

下のコード例では、

  • ノード全体の出力(デバッック用)
  • ツリーをJSONとして表示(デバッック用)
  • メソッドの行数(練習)
  • forEachのなかにforEachがある部分(前のプロジェクトでチェックしたかった箇所)

を出力しています。

いろいろできると思います。

  • 長いラムダ式を抽出
  • 嘘をついている変数名の抽出(例、Mapなのに変数名がListとなっている)
  • コメントだけを抜き出して、文章をチェックするとか(オフショア案件の時)

JavaParser Sample