IrenkaでClassCastExceptionの対策。

Irenkaを使用したコンパイル時に、NavigatedProperty#apply(Synthesizer, CtElement) 内98行目でClassCastExceptionが発生するケースがありまして、少し調べてみました。

NavigatedProperty.java 92行目で target の実装が CtEnumConstantMaster であり、navigationの値がNavigation.NAMED_REFERENCE_SIMPLE_NAME である時、CtElement#getProperty が getSimpleName() の結果(String)を返すため、その後のキャストに失敗するようです。

そこで、resultを取得した後の条件分岐で以下のコメント部で示す2行を追加し、回避するようにしてみたところ、ひとまず現在私が作成したHackは意図通りに動いているようです。

    public ResultValue apply(Synthesizer synth, CtElement target) {
        ElementKind kind = target.getElementKind();
        if (!getApplicableKinds().contains(kind)) {
            return null;
        }
        Object result = target.getProperty(navigation);
        if (navigation.getKind() == NavigationKind.ELEMENT_LIST) {
            List<? extends CtElement> list = (List<? extends CtElement>) result;
            return ResultValue.of(list);
        } else if(result instanceof String) {  // この2行を
            return ResultValue.of(target);     // 追加
        }
        else {
            CtElement elem = (CtElement) result;
            return ResultValue.of(elem);
        }
    }

なんか、動きも把握せずにこんな手ぇ加えて、大丈夫かなwww