-下書き

Irenkaのプロセッサは、プロセッサ内で行いたいソースコード操作に必要なオブジェクトをパラメータに宣言したメソッドとして実装します。パラメータに宣言できるオブジェクトはIrenkaの提供するJavaソースコードのDOM-APIオブジェクトもしくはツールキットです。DOM-APIは、org.ashikunep.irenka.domパッケージ内に用意されている50個ほどの「CtAnnotation」など「Ct」で始まるインターフェイス群で、「CtClass」や「CtMethod」のほか、for文をあらわす「CtFor」やJavadocにアクセスするための「CtJavadoc」などがあります。ツールキットは、org.ashikunep.irenka.toolkitパッケージに用意されていて、ログ出力コンテキストやDOMエレメントファクトリ、DOMエレメント操作ユーティリティなどです。

code.x 
/**
 * @when
 */
public void checkMethod(Messager messager, CtMethod self) {
    // CtMethod#getModifiers(): List<ModifierKind>
    if(self.getModifiers().contains(ModifierKind.PUBLIC)) {
        // CtReference#getJavadoc(): CtJavadoc
        // CtElement#exist(): boolean
        if(self.getJavadoc().exists() == false) {
            messager.warn(self, "メソッドにJavaDocが書かれていません");
        }
    }
}

code.xに例示したメソッドは、付加されたJavadoc中に「@when」タグをつけることによってIrenkaプロセッサであるということを示し、メソッドの引数は、Messager(org.ashikunep.irenka.toolkit.Messager)および、CtMethod(org.ashikunep.irenka.dom.CtMethod)が宣言されています。CtMethod型のselfパラメータに対し、修飾子がpublicであることとJavadocが存在するかどうかを調べ、publicなのにJavadocが書かれていない場合には引数に渡されたMessagerを利用して警告ログを出力する、というサンプルです。CtMethodはソースコード上の全てのメソッドに対応するDOMエレメントのため、例示プロセッサをもって実際にプログラムをコンパイルすると、プログラム内の全ソースコード上にある全てのメソッドの個数分だけ呼び出されて、全メソッドについてJavadocの存在チェックを行うことができます。

code.xx
/**
 * @when public in self.modifiers
 */
public void checkMethod(Messager messager, CtMethod self) {
    if(self.getJavadoc().exists() == false) {
        messager.warn(self, "メソッドにJavaDocが書かれていません");
    }
}

@whenタグに制約式(クエリー)を記述すると、全言語要素から該当する箇所のみを抽出します。クエリーの評価結果、該当する箇所を絞り込まれればそれだけプロセッサの呼び出し回数は減り、コンパイル時間は短縮されるはずです。クエリーは複数行書くことが可能で、組み合わせにより複雑な条件を書くことができますが、1行の内容はとてもシンプルです。
code.xxの「public in self.modifiers」という一文は、メソッドの修飾子のリストに、「public」が含まれるかをテストする内容です。こちらではcode.xの場合と異なり、プロセッサに渡されてくるソースコード中のメソッドは、publicアクセスのメソッドのみとなります。「private」や「protected」やパッケージローカルなメソッドは除かれますから、おそらくコンパイル時間も短縮されることでしょう。また、クエリーにてpublicなもののみに絞り込んでいるために、プロセッサメソッド中のコードで判定する手間が省けています。