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)があって、それに違反した箇所を見つけて指摘するのがCheckstyleCheckstyleは、独自のルールを組む事が出来ない訳ではないのだが、俺はよく知らない。

Irenkaは、掟に背いた部分を「指摘する」のはもちろん、「勝手に直す」こともできる無茶苦茶な奴なんだ。しかも掟は自分で書ける。(というか、標準では提供されていないっぽいので自分で書くしかないw)

コンパイルのタイミングでコンパイラに「介入」を行い、問題点の指摘やコードの修正など、様々な動作が出来、それを自分で書くことができるのがIrenka。

その動作を、Irenkaでは「Hack」と呼ぶ。

今日は萌えに萌えたので、エントリー長いゼ。

続きを読む