サンプル集
The Ashikunep Kotan
Seasarファウンデーション
Best viewd by Firefox2

サンプル集

Irenkaに関するサンプルを集めました。(準備中)

クエリ:特定の名前を持つクラスを探す

名前の末尾が"Test"のクラスを探します。

/**
 * @when
 *     klass.simpleName =~ ".*Test"
 */
public void found(CtClass<?> klass) {
  // ...
}

string =~ regexは文字列stringが正規表現regexで表わせるかどうかを調べます。 klass.simpleName =~ ".*Test"は、klassの単純名が".*Test" (末尾が"Test") であるものが該当します。

クエリ:注釈探す

特定の型で宣言された注釈を探します。

/**
 * @when
 */
public void found(CtAnnotationInstance<? extends Deprecated> annotation) {
  // ...
}

クエリを空にしておくと、引数のCtAnnotationInstance<? extends Deprecated> annotationに代入可能な全ての要素を探し出します。 つまり、@Deprecatedで表現される全ての注釈を探します。 Deprecatedではなく? extends Deprecatedとして宣言しているのは、 注釈の実体がDeprecated型を実装するクラス(通常はProxyインスタンス)であるためです。

クエリ:特定の型で宣言されたフィールドを探す

配列型で宣言されたフィールドを探します。 この例ではプリミティブ型の配列は見つけられません。

/**
 * @when
 *   field.type <= {@link Object[]}
 */
public void found(CtField<?> field) {
  // ...
}

type1 <= type2type1type2のサブタイプであるかどうかを調べます。 ここではObject[]型のサブタイプを探しているので、String[]Integer[][]などが該当します。

クエリ:メソッドの呼び出しを探す

Math.abs(int)を呼び出すメソッドを探します。 Math.abs(double)などの呼び出しは対象になりません。

/**
 * @when
 *   invocation.target = {@link Math#abs(int)}
 */
public void found(CtMethodInvocation<?> invocation) {
  // ...
}

クエリ:特定の修飾子を探す

publicかつstaticかつfinalで宣言されている要素を探します。

/**
 * @when
 *     public in klass.modifiers
 *     static in klass.modifiers
 *     final in klass.modifiers
 */
public void found(CtClass<?> klass) {
  // ...
}

クエリ:ラベル付きのブロックを探す

"JOIN_"から始まる名前を持ったラベルが付いているブロックを探します。 JOIN_START: { ... }などが該当します。

/**
 * @when
 *   labelName in block.labels.simpleName
 *   labelName =~ "JOIN_.*"
 */
public void found(CtBlock block) {
  // ...
}

クエリ:命名規則(1)

javax.swing.JButton型のフィールドは必ず"fButton"から始めるというルールを作ってみます。

/**
 * @when
 *   field.simpleName !~ "fButton.*"
 */
public void found(Messager msgr, CtField<javax.swing.JButton> field) {
  msgr.warn(field, "JButton型のフィールド名はfButtonから始めなければなりません");
}