snuffkinの遊び場

IT関係、スポーツ、数学等に関することを、気が向いたときに書いてます。

isDebugEnabledの中でdebugメソッドを呼んでいないコードを検出

つぎは、性能問題をチェックするためのHack。ここに書いてあるHackの変形版です。(直感的にはCategoryの所をLoggerにしたいのですが、Loggerにするとうまく動かないですね)

    /**
     * @when
     *   invocation.target = {@link Category#debug(Object)}
     *   except {
     *     enabled : {@link CtMethodInvocation}
     *     enabled.target = {@link Category#isDebugEnabled()}
     *     guard : {@link CtIf}
     *     guard in enabled.ancestors
     *     guard in invocation.ancestors
     *   }
     */
    public void found(CtMethodInvocation<?> invocation,
                      Messager messager) {
        ...
    }

このHackを利用すると、以下のようなコードをチェックできます。

    logger.debug("debug test"); // 問題として検出

    if (logger.isDebugEnabled()) { // 問題なし
        logger.debug("debug test");
    }

    if (logger.isDebugEnabled() == true) { // 問題なし
        logger.debug("debug test");
    }

ただし、このHackだと、以下のようなものは検出できない。こんなことする人はいないだろうから、これは検出できなくても良いかな?

    if (true) { // このQueryでは検出できない
        logger.isDebugEnabled();
        logger.debug("debug test");
    }