#java #abstract-syntax-tree #eclipse-jdt
#java #абстрактное синтаксическое дерево #eclipse-jdt
Вопрос:
Я экспериментирую с eclipse jdt AST и сталкиваюсь со странным поведением, которому я не могу найти объяснения.
Вот мой пример кода:
public static void main(String[] args) {
StringBuilder content = new StringBuilder();
content.append("class Foo {");
content.append(" enum Bar {");
content.append(" VALUE;");
content.append(" int getValue() {");
content.append(" return 4;");
content.append(" }");
content.append(" }");
content.append(" int getValue() {");
content.append(" return 42;");
content.append(" }");
content.append("}");
ASTParser parser = ASTParser.newParser(AST.JLS13);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(content.toString().toCharArray());
CompilationUnit astNode = (CompilationUnit) parser.createAST(null);
Visitor rtVisitor = new Visitor();
astNode.accept(rtVisitor);
}
private static class Visitor extends ASTVisitor {
@Override
public boolean visit(TypeDeclaration node) {
System.out.println(node);
return super.visit(node);
}
}
Как вы можете видеть, я определяю очень простой пример класса, который имеет внутренний класс enum, где оба класса имеют метод с одинаковой сигнатурой.
Как ни странно, вывод этого кода (т. Е. Проанализированный TypeDeclaration
)
class Foo {
enum Bar;
{
}
int getValue(){
return 4;
}
{
}
int getValue(){
return 42;
}
}
По какой-то причине тело TypeDeclaration
состоит из:
- a
FieldDeclaration
:enum Bar;
- an
Initializer
:{}
- a
MethodDeclaration
:int getValue(){ return 4; }
- другой
Initializer
:{}
- другой
MethodDeclaration
:int getValue(){ return 42; }
Это приводит к тому, что мой фактический код выдает ошибку, потому что похоже, что есть два метода с идентичной сигнатурой.
Почему я не получаю перечисление как фактическое EnumDeclaration
с помощью внутренних методов, а скорее похоже, что метод внутри перечисления фактически объявлен в самом внешнем классе?
Я не думаю, что это ошибка, потому что представление AST в eclipse отлично обрабатывает аналогичный класс, но я не могу понять, что я делаю неправильно. Включение разрешения привязки не помогло.
Ответ №1:
Вам нужно установить параметры компилятора путем вызова parser.setCompilerOptions
, чтобы исходный файл обрабатывался правильно.
Поскольку вы используете enum
ключевое слово, вам нужно как минимум соответствие Java 5:
ASTParser parser = ASTParser.newParser(AST.JLS13);
Map options = JavaCore.getOptions();
JavaCore.setComplianceOptions(JavaCore.VERSION_1_5, options);
parser.setCompilerOptions(options);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(content.toString().toCharArray());
Комментарии:
1. Спасибо, это сделало свое дело! Я не думал, что мне придется указывать целевую версию Java во вторую очередь.