Почему в моем AST TypeDeclaration отсутствуют методы и поля? - PullRequest
0 голосов
/ 03 февраля 2012

Я создал небольшую программу, которая читает файл Java и передает его в ASTParser из Eclipse JDT для построения дерева абстрактного синтаксиса (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: 0 и Methods: 0, когда я фактическиожидайте Fields: 2 и Methods: 6.

1 Ответ

1 голос
/ 07 февраля 2012

Проблема с приведенным выше кодом заключается в том, что символы новой строки (\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 методов!

...