Android checkstyle - 调试自定义检查

时间:2017-07-31 05:05:25

标签: android-studio debugging gradle checkstyle

我想为Checkstyle 8.1编写自定义支票。我成功安装并配置了Gradle Checkstyle并写了我的支票草图。但是当我试图运行我的支票时 - 我收到了错误

Execution failed for task ':app:checkstyle'.
> Unable to process files: FILE1, FILE2 ...

这是我的支票代码

package com.lsurvila.checkstyle;
import com.puppycrawl.tools.checkstyle.api.*;

import javax.xml.ws.LogicalMessage;

public class LinesAfterClassJavadocCheck extends AbstractCheck
{
    private static final int DEFAULT_MAX = 30;
    private int max = DEFAULT_MAX;

    /**
     * Returns the default token a check is interested in. Only used if the
     * configuration for a check does not define the tokens.
     *
     * @return the default tokens
     * @see TokenTypes
     */
    @Override
    public int[] getDefaultTokens() {
        return new int[]{TokenTypes.CLASS_DEF, TokenTypes.INTERFACE_DEF};
    }

    /**
     * The configurable token set.
     * Used to protect Checks against malicious users who specify an
     * unacceptable token set in the configuration file.
     * The default implementation returns the check's default tokens.
     *
     * @return the token set this check is designed for.
     * @see TokenTypes
     */
    @Override
    public int[] getAcceptableTokens() {
        return new int[0];
    }

    /**
     * The tokens that this check must be registered for.
     *
     * @return the token set this must be registered for.
     * @see TokenTypes
     */
    @Override
    public int[] getRequiredTokens() {
        return new int[0];
    }

    @Override
    public void visitToken(DetailAST ast)
    {
        //throw new IllegalArgumentException("SUKA BLEAT");
        DetailAST objBlock1 = ast.findFirstToken(TokenTypes.LITERAL_CLASS);
        if (objBlock1 == null) {
            log(ast.getLineNo(), "PIDOR");
            //System.out.print("PIDOR");
        }

        String a = getLine(objBlock1.getLineNo()-1);
        log(1,a);
        //System.out.print(a);
        if (a.isEmpty()) {
            log(ast.getLineNo(), "PIDOR1");
        }

        /*DetailAST objBlock2 = ast.findFirstToken(TokenTypes.MODIFIERS).findFirstToken(TokenTypes.BLOCK_COMMENT_BEGIN);
        if (objBlock2 == null) {
            log(ast.getLineNo(), "PIDOR1");
            //System.out.print("PIDOR");
        }*/

        /*DetailAST objBlock2 = ast.findFirstToken(TokenTypes.LITERAL_CLASS);

        DetailAST objBlock3 = objBlock1.findFirstToken(TokenTypes.MODIFIERS).findFirstToken(TokenTypes.BLOCK_COMMENT_BEGIN).findFirstToken(TokenTypes.BLOCK_COMMENT_END);




        if (objBlock3.getLine()+2 != objBlock2.getLine()) {
            log(ast.getLineNo(), "PIDOR");
        }*/
    }
}

我发现log()方法产生了这个异常。我没有找到另一种方法来查看我的代码中发生了什么 - 甚至System.out.print()都没有显示任何内容。如何运行附加到我的自定义检查的调试器?在编译应用程序之前我的检查已启动,这种情况很复杂。

以下是我在应用项目中检查的方式: enter image description here

抱歉我的英文不好

1 个答案:

答案 0 :(得分:0)

我建议使用Command line interface查看Checkstyle的原始输出和错误。我不是特别知道gradle如何处理这些情况,但System.out应该从CLI开始工作。如果仍然没有输出,则可能是visitToken甚至没有被调用。

我还建议使用-t选项查看文件的AST树,以确认您正在为您的支票抓取正确的代币。

    return new int[0];

这是错误的,你必须为Acceptable返回一个令牌,否则你说你的支票什么都不接受。将其更改为返回getDefaultTokens

我建议您在their google group form获得小组的帮助。