java - 带有内部枚举类的 Eclipse AST 的奇怪结果

标签 java abstract-syntax-tree 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);
    }
}
如您所见,我正在定义一个非常简单的示例类,它具有一个内部枚举类,其中两个类都有一个具有相同签名的方法。
奇怪的是,这段代码的输出(即解析的 TypeDeclaration )是
class Foo {
  enum Bar;
{
  }
  int getValue(){
    return 4;
  }
{
  }
  int getValue(){
    return 42;
  }
}
出于某种原因,TypeDeclaration 的正文由组成:
  • 一个 FieldDeclaration : enum Bar;
  • 一个 Initializer : {}
  • 一个 MethodDeclaration : int getValue(){ return 4; }
  • 另一个Initializer : {}
  • 另一个MethodDeclaration : int getValue(){ return 42; }

  • 这导致我的实际代码抛出错误,因为看起来有两个具有相同签名的方法。
    为什么我没有将枚举作为实际 EnumDeclaration使用内部方法,而是看起来像枚举内部的方法实际上是在外部类本身中声明的?
    我不认为这是一个错误,因为 Eclipse 中的 AST View 可以很好地处理类似的类,但我无法弄清楚我做错了什么。启用绑定(bind)解析没有帮助。

    最佳答案

    您需要通过调用 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());
    

    关于java - 带有内部枚举类的 Eclipse AST 的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64223933/

    相关文章:

    java - 可能的内联 "pre-assignment"操作?

    java - 以编程方式编译 Xtend 类不起作用

    java - 如何自定义Eclipse生成的hashCode()和equals()?

    java - Hibernate 返回多个外部实体

    java - TextView 没有出现在带有自定义适配器的 ListView 中

    java - log4j 没有记录到文件

    typescript - 使用typescript编译器API获取接口(interface)字段类型信息

    java - Eclipse 中 C 代码的语法树

    python - 用于解析 Python 源以在全局变量后提取文档字符串的示例 ast 代码

    java - 检查 MethodDeclaration 是否类似于 IMethod