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