GumTreeの改良ツールIJM(Iterative Java Matcher)の論文.

GumTreeはAST単位でソースコードの差分を出力するツールである. GumTreeは1. 変更前後でのASTのノードのマッチング,2. 編集スクリプトの計算 の二段階で構成されている. 2は十分に最適化されている(証明済み)だが,1に難があり不正確な差分を出力することが多い. IJMは以下の方法を採用してノードのマッチング精度を向上させている.

  1. 部分的な範囲でのマッチング
    GumTreeのbottom-upフェーズとは異なり,コードの構成的に小さい単位(内部クラス -> メソッド -> クラス)でマッチングを行っていく.
  2. ノードへの名前の埋め込み
    親ノードは違うが,同じSimpleNameノードが不適切にマッチングされることを防ぐ(例: ローカル変数fooがメソッドfooにマッチング).
  3. 名前の類似度でマッチング 似ている名前のノードをマッチングする. レーベンシュタイン距離を使っている.

多少恣意的ではあるかも知れないが,2ページ目で使われている例が完璧すぎて面白い.