サンプル集
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 <= type2はtype1がtype2のサブタイプであるかどうかを調べます。
ここでは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から始めなければなりません");
}


