未踏ソフトウェアの分
未踏ソフトウェアとして採択された部分の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)}の呼び出しであることが確定されてます。