クエリ

言ってみればDIかも。
進捗遅れ気味で多方面にご迷惑かけてますが、↓がリアルタイムで動きました。

/**
 * @when
 *     protected in x.modifiers
 */
public void sample(Messager messager, CtMethod<?> x) {
    messager.warn(x, x.toString());
}


まず、「@when」でコンパイル対象の構造を検出するクエリ文を書き始めます。
クエリの文法についてはオフィシャルでいずれ。

クエリの「protected in x.modifiers」は、次のように解釈します。

  1. x はコンパイル対象の任意の要素
  2. x は属性 "modifiers" (修飾子一覧) を持つ
  3. x はメソッドである (引数の CtMethod xより推論)
  4. x の修飾子一覧を x1 と置くと
    1. 修飾子 "protected" は x1 に含まれる

上記すべてを同時に満たすxがコンパイル対象から検出され、メソッドsampleの第2引数に順次ドライブされます。
第1引数の「Messager messager」はロガーのようなもので、環境から自動的にドライブされます。