未踏ソフトウェアの分

未踏ソフトウェアとして採択された部分のIrenkaがだいたい完成です。
週明けに動作テストして、問題なければ0.3系統としてリリースします。

ちなみに勉強会の資料を今作ってます。アウトラインレベルでは完成。

(偽)インクリメンタルビルドができるようになりました。

(真)インクリメンタルビルドは今のアーキテクチャだと実現が難しいので、仮の対応となります。
それでも、10000行クラスのコードは普通にコンパイルできるので、少し成長した感じ。

クエリの文法を追加しました

/**
 * @when
 *   fine.target = {@link Logger#fine(String)}
 *   except {
 *     guard: {@link CtIf}
 *     guard in fine.ancestors
 *     condition = guard.condition
 *     condition.target = {@link Logger#isLoggable(Level)}
 *     condition.arguments[0].target = {@link Level#FINE}
 *   }
 */
public void found(CtMethodInvocation<?> fine, Messager m) {
    m.warn(fine, "unguarded...");
}
LOG.fine("Hello"); // WARN!
if (LOG.isLoggable(Level.FINE)) {
  LOG.fine("Hello"); // OK.
}

except { ... } の中にサブクエリを書いて、サブクエリの失敗が外側の成功になるイメージ。
外側から見ればexceptはただの制約の一つなので、いくつでも書くことができます。
サブクエリはencloseされたクエリの途中結果を引き継いでいるので、上記の例だとfineは{@link Logger#fine(String)}の呼び出しであることが確定されてます。