PSI自分メモ

この手の便利系メソッドはOpenAPIで持っていて欲しいものだ.:-(

public static boolean 自分もしくは先祖に指定した型があるかチェック(PsiType type, String fqcn) {
    if (!(type instanceof PsiClassType)) return false;
    if (fqcn.equals(type.getCanonicalText())) return true;
    for (PsiType superType : type.getSuperTypes()) {
        // やっぱ,再帰しないと先祖の型チェックはできなかった.orz
        boolean result = isCheckedType(superType, fqcn);
        if (result) return true;
    }
    return false;
}

public static PsiExpression 指定した位置の引数を取得する(PsiCallExpression expression, int position) {
    // 存在チェックが結構くどい
    PsiExpressionList arguments = expression.getArgumentList();
    if (arguments != null) {
        PsiExpression[] argExpressions = arguments.getExpressions();
        if (position < argExpressions.length) {
            return argExpressions[position];
        }
    }
    // 呼出し側でいちいちnullチェックするのもウザいので,例外飛ばしてる.
    throw new NullPointerException();
}

public static PsiLiteralExpression 指定した型のリテラル式に変換する(PsiExpression arg, Class type) {
    // これも存在チェックが結構くどい
    if (arg instanceof PsiLiteralExpression) {
        PsiType psiType = arg.getType();
        // リテラル式は"java.lang.*"で済むので,Classで貰っても平気
        if (psiType != null && psiType.equalsToText(type.getName())) {
            return (PsiLiteralExpression) arg;
        }
    }
    // 呼出し側でいちいちnullチェックするのもウザいので,例外飛ばしてる.
    throw new NullPointerException();
}

ps.
プラグイン書いてて思ったが,Java5に慣れてないと,JDK1.4時代の書き方と拡張文法がごっちゃになって,かえって読みづらくなるもんだな(特に拡張for文と総称型が顕著だった).