Странный результат eclipse AST с внутренним классом enum

#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 состоит из:

  1. a FieldDeclaration : enum Bar;
  2. an Initializer : {}
  3. a MethodDeclaration : int getValue(){ return 4; }
  4. другой Initializer : {}
  5. другой 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 во вторую очередь.