为什么我的AST TypeDeclaration缺少其方法和字段?

时间:2012-02-03 04:04:57

标签: java abstract-syntax-tree eclipse-jdt

我创建了一个小程序,它读取Java文件并从Eclipse JDT将其提供给ASTParser,以构建抽象语法树(AST)。根节点是我能够访问的CompilationUnit。然后,我遍历 Types 集合,其中包含Java文件中的类。就我而言,只有一个(公共类)。此类表示为 TypeDeclaration 类型的对象。我知道我已成功访问此对象,因为我能够获取其SimpleName并将其打印到控制台。

TypeDeclaration 有许多方法,包括getFields()getMethods()。但是,当我调用这些方法时,它们会返回空的集合。我正在阅读的Java类肯定有字段和方法,所以我不明白为什么它会变成空的。是什么原因引起了这个?我是否以某种方式滥用此API或者我没有初始化某些内容?

以下是我访问AST的代码的简化版本:

// char array to store the file in
char[] contents = null;
BufferedReader br = new BufferedReader(new FileReader(this.file));
StringBuffer sb = new StringBuffer();
String line = "";
while((line = br.readLine()) != null) {
    sb.append(line);
}
contents = new char[sb.length()];
sb.getChars(0, sb.length()-1, contents, 0);

// Create the ASTParser
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(contents);
parser.setResolveBindings(true);
CompilationUnit parse = (CompilationUnit) parser.createAST(null);

// look at each of the classes in the compilation unit
for(Object type : parse.types()) {
    TypeDeclaration td = (TypeDeclaration) type;
    // Print out the name of the td
    System.out.println(td.getName().toString()); // this works
    FieldDeclaration[] fds = td.getFields();
    MethodDeclaration[] mds = td.getMethods();
    System.out.println("Fields: " + fds.size()); // returns 0???
    System.out.println("Methods: " + mds.size()); // returns 0???
}

这是我正在阅读的Java文件:

public class Vector {

    // x, the first int value of this vector
    private int x;

    // y, the second int value of this vector
    private int y;

    public Vector(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public String toString() {
        return "Vector( " + this.x + " , " + this.y + " )";
    }

    public int getX() {
        return x;
}

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

因此,正如预期的那样,我的AST代码中的第一个打印结果为Vector,但后续打印结果为Fields: 0Methods: 0,而我实际上期望{{1} }和Fields: 2

1 个答案:

答案 0 :(得分:1)

上述代码的问题在于换行字符(\n)正在丢失。每次将BufferedReader的内容附加到StringBuffer(sb)时,都不会包含\n。结果是从示例程序的第3行开始,所有内容都被注释掉,因为程序被读入:

public class Vector { // x, the first int value of this vector private int x; ...

不用担心,因为有一个简单的解决方案。在解析程序的while循环内部,简单地将\n附加到每行输入读取的末尾。如下:

...
while((line = br.readLine()) != null) {
    sb.append(line + "\n");
}
...

现在应该正确读取程序,输出应该是预期的2个字段和6个方法!