MetricsReloadedのライン数が他のステップカウンタ系と異なる

ってのに気づいた。MetricsReloadedってのは、IntelliJプラグインでLOCやら循環参照複雑度とか計測してくれるプラグインIntelliJ標準のInspectorにもmetricsカテゴリでいくつか計測可能なんだけど、どうゆうわけかLOCは計測できない。
#あ、LOCって"Lines of Code"の事ね。


そんでよく使ってたのが、このMetricsReloaded。似たようなのにStatisticってのがある。IntelliJでLOC数えたいと思ったら、MetricsReloadedかStatistic使うしか選択肢はないんじゃないかな。


で、モノは試しにこいつら同じ値を計測するんだよな?と試してみたら違かった。:-(
検証用にEclipsestepcounterでも計ってみたら、Statisticと同じ値になった。さらに目視でも確認したところ、MetricsReloadedの値がおかしいってのがわかった。


MetricsReloadedのソースみたら理由は分かったんだけど、つまりはこうゆうことらしい。

Lines of Code
いわゆるライン数なんだけど、空白とクラス宣言前の文(packageとimport)が計測されない。つまりクラス本体の空白以外のライン数が計上される。
Source Lines of Code
実行行数。Lines of Codeからコメント行を除いたライン数。上と同じ理由でpackageとimport部分が計測されない。
Comment Lines of Code
コメント行数。LOCと似たような理由でpackage宣言より前のコメント(ヘッダコメント?)が計測されない。
Member of top-level classes
いわゆるクラスファイル数。Member of classesだと内部クラスも別に数えちゃうので、クラスファイル数にならないのに注意。

うむ、とっても微妙。package、importを無視するのは百歩譲って許すとして(イヤ、許したくないけどw)、なぜ空白行を無視する。そんでもって、空白行だけを計測する方法もない。つまり、今のMetricsReloadedでは、どうがんばってもStatisticやstepcounterと同じ測定値を出せないってところまでわかった。


計測値が合わない理由はわりと簡単で、このプラグイン、単純に対象ファイルを読み込んでいるのではなく、IntelliJが内部的に管理してるAST(IntelliJ用語だとPSI?)を元にLOCとかを計測してるからみたい。ちょうどPsiViewerって便利プラグインがあるので、それ使うと一目瞭然だった。
PSI使うアイデアは面白いのだけれど、そもそもの計測結果が間違ってるのに、さらに計測対象を変えると、もっと違う値になるとかやめて欲しい(プロジェクトの総LOCとか、クラス別に集計した値と、モジュール/プロジェクト単位で集計した値が異なるとかあった。


理屈がわかったので、その気になったら直すかもしんない。それよっかStatisticを使うか、stepcounterをIntelliJプラグイン化したほうが良い気もするけど...。とりあえず覚えている内にメモは残した。
あと、IDEA11でMetricsReloaded動かないと思うのだけど、もしダメそうだったら、ここにあるの試してみて。
Downloads · masanobuimai/MetricsReloaded · GitHub