使用java AST解析器的行号计数器

时间:2015-01-22 21:41:48

标签: java abstract-syntax-tree

我有一些有趣的练习 - 用Java读取.java文件,找到这个.java文件中的每个代码部分(比如方法等),并说明我们在没有空格和注释的每个方法中有多少行号并且还要找到每种方法中的项目数。

以下是我使用的一些示例 - Java Parser也是如此。使用代码,我可以说我在方法中有多少行号,但不能删除空格和注释的计数。有人能帮助我吗?

代码:

public static void main(String[] args) throws ParseException, IOException {
    File f = new File(".").getAbsoluteFile();
    File srcRoot = new File(f, "src");
    String srcFilename = TestMethodLineNumber.class.getName().replaceAll("\\.", "/") + ".java";
    File src = new File(srcRoot, srcFilename);
    System.out.println(f);
    System.out.println(srcRoot);
    System.out.println(src);
    getMethodLineNumbers(src);
}

private static void getMethodLineNumbers(File src) throws ParseException, IOException {
    CompilationUnit cu = JavaParser.parse(src);
    new MethodVisitor().visit(cu, null);
}

/**
 * Simple visitor implementation for visiting MethodDeclaration nodes.
 */
private static class MethodVisitor extends VoidVisitorAdapter {
    @Override
    public void visit(MethodDeclaration m, Object arg) {
        System.out.println("From [" + m.getBeginLine() + "," + m.getBeginColumn() + "] to [" + m.getEndLine() + ","
                + m.getEndColumn() + "] is method:");
        System.out.println(m);
    }
}

}

1 个答案:

答案 0 :(得分:0)

在我看来,JavaParser已经删除了空白行,我会使用此线程Removing all types of comments in java file中的一种技术删除所有注释,然后使用JavaParser来获取结果。

一般来说,除非您真正追求可执行代码,否则这些问题并不总是很有趣。考虑:

if (a)
{
    runA();
}
else
{
    runB();
}

你的数字将是8,这究竟是什么告诉你的?知道有一个if语句和/或两个方法调用更有意思吗?您真的想要更好的约束来了解您的目标:

a ? runA() : b ? runB(): runError("nothing true");

只有一行,但您有3个潜在的执行分支。你也可以遇到一些跨越多行的疯狂语句。

MyFancyObject myFancyObject = new MyFancyObject("This is my really long name",
                                                123113212,
                                                "2014-11-20 18:43:12",
                                                anotherArg, yetAnother,
                                                moar);

这应该是5行还是1?