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
例外の対処方法がわからん(T^T)
例によって、多分俺が悪いんだけどw 何が悪いのか発見できない><;
org.ashikunep.irenka.dom.converter.jls.JlsLinkExceptionというのがしばしば発生する。下記のGetNodesProcessor(Jiemamyのクラス)以外にも、この辺りの型に対して、しばしば怒っているのを見かけるなぁ。共通項はなんだろう…。
- org.seasar.framework.util.Disposable
- org.seasar.framework.util.ArrayMap
- org.apache.commons.io.IOUtils
- org.junit.runner.RunWith
Hackしたいけど実現できていないこと(1)
id:taichitaichiから伝授されて以来、守っている掟がある。
「否定演算子(!)は見にくいので使わない」ことである。if(!foo) ではなく if(foo == false) と書く*1。
これを指摘するHackを作ろうと思った。
import org.ashikunep.irenka.dom.CtUnary; import org.ashikunep.irenka.dom.UnaryOperator; import org.ashikunep.irenka.toolkit.Messager; /** * 否定演算子をチェックするIrenka Hack。 * @author daisuke */ public class NotOperatorChecker { /** * インターフェイスに関する命名規則チェック。 * @param messager * @param unary 単項演算子 * @when {@link UnaryOperator#NOT} = unary.operator */ public void foundNotOperator(CtUnary<Boolean> unary, Messager messager) { messager.warn(unary, "否定演算子は推奨されません。\"!foo\"は\"foo == false\"に書き換えて下さい。"); } }
これを以下のコードに適用してみる。
*1:値の反転の時は使っても良いんじゃないかと思っているけど。ex. boolean y = !x;
萌え萌えIrenka
運命だったのか魔が差したのか、Irenkaのドキュメントを読んでしまって。惚れた。やばい、これは使わなければ。と、すぐに地豆に適用してしまったw
Irenkaとは何か。
誤解を恐れずに言えば、高機能Checkstyleみたいなものです。ただ、出来ることは何かを見つけて指摘するだけじゃない。コンパイルのタイミングで、コードを書き換えちゃうことだってできるのだ。
とあるコーディング規約(Irenkaでは「掟」と呼ぶのか?w)があって、それに違反した箇所を見つけて指摘するのがCheckstyle。Checkstyleは、独自のルールを組む事が出来ない訳ではないのだが、俺はよく知らない。
Irenkaは、掟に背いた部分を「指摘する」のはもちろん、「勝手に直す」こともできる無茶苦茶な奴なんだ。しかも掟は自分で書ける。(というか、標準では提供されていないっぽいので自分で書くしかないw)
コンパイルのタイミングでコンパイラに「介入」を行い、問題点の指摘やコードの修正など、様々な動作が出来、それを自分で書くことができるのがIrenka。
その動作を、Irenkaでは「Hack」と呼ぶ。
今日は萌えに萌えたので、エントリー長いゼ。