コミット履歴からリファクタリングを検出するツールRefDiffの論文.
リファクタリングのマイニングは様々な用途に役立つ(i.e. API破壊の検出)が,既存のツールは全てJavaのみを対象としている. そこで著者らは,言語に依存しない抽象的なソースコード表現と経験則を用いることで,多言語に対応できるリファクタリング検出ツールRefDiffを開発した.
RefDiffではソースコード表現としてCST(Code Structure Tree)を採用している. これは,ASTと比べてかなり抽象的な表現であり,既存のツール(JDTとか)が出力するASTを変換することで得られる. CSTは,例えばJavaだとクラスやメソッド,Cだとファイルと関数といった粗粒度な要素の親子関係や呼び出し関係で構成される. また,それぞれの要素は引数や字句列に変換したメソッドボディなどの情報を持つ.
RefDiffは対象のコミット間で変更があったファイルをCSTに変換し,それぞれの要素を対応づけることでリファクタリングを検出する. 対応づけの方法として,要素番号や,メソッドボディのTF-IDFなどを用いている.
実験結果として,JavaではRefactoring Miner(1.0)と同程度の精度,実行時間でリファクタリングを検出でき,CやJSでも高い精度でリファクタリングを検出できることを示した.
所感. 多言語対応はすごいと思った. 例えばRefactoring MinerだとJavaのASTの各ノードに対してゴリゴリにマッチング処理を行なってリファクタリング検出を行なっているので,そういう手法だと多言語対応は厳しそう. 経験則もうまいこと効いてそうだと思った. ただ,やはり精度はRefactoring Minerに敵わない(論文中では1.0と比較しているが,最新版の2.0がリースされているので,それと比較するとボロ負けしそう)のは,もうどうしようもないかなって感じ. また,対応しているリファクタリングが少ない. 特に,RefDiffのバージョンアップに際してフィールドに関するリファクタリング検出ができなくなったりしている. 同様に,CSTという粗粒度な木のマッチングを使っているので,低レベルリファクタリング(メソッドの中で閉じたリファクタリング)を検出できないのも痛い気がする.