java - Eclipse JDT ASTParser 错误地转换枚举声明节点

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

我正致力于使用 JDT 分析 Java 代码,并打算构建一个依赖于 org.eclipse.jdt.core 包而不是 eclipse 插件的独立分析工具。但是我发现我的工具无法在 Java 代码中出现的枚举声明节点上正常工作。在我由 jdt 创建的 AST 中,关键字 enum 被视为类型名而不是 enum 声明。所以我想知道我应该如何确保我的工具能够正确处理枚举声明。

我使用的jdt包是“org.eclipse.jdt.core_3.8.3.v20130121-145325.jar”。 createAST 代码是:

char[] javaprogram=getJavaFile(javaFileName);
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setSource(javaprogram);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
final CompilationUnit cu = (CompilationUnit) parser.createAST(null);

java 输入如下:

package test;

enum Color
{
  RED(255, 0, 0),  BLUE(0, 0, 255),  BLACK(0, 0, 0),    YELLOW(255, 255, 0),  GREEN(0, 255, 0);

  private int redValue;
  private int greenValue;
  private int blueValue;

  private Color(int rv, int gv, int bv)
  {
    this.redValue = rv;
    this.greenValue = gv;
    this.blueValue = bv;
  }

  public String toString()
  {
    return super.toString() + "(" + this.redValue + "," + this.greenValue + "," + this.blueValue + ")";
  }
}

但是使用 astparser.createAST() 获取 CompilationUnit 节点只是得到了包含包代码的代码:

package test;

问题通过添加CompilerOptions解决,代码如下:

Map options = JavaCore.getOptions();
options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5);
options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_5);
options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5);
parser.setCompilerOptions(options);

最佳答案

正如您自己回答的那样,您必须将编译器版本设置为较新的版本,因为默认版本是 1.3

Map options = JavaCore.getOptions();
System.out.println(options.get(JavaCore.COMPILER_SOURCE)); //outputs 1.3

但是(我认为)枚举声明仅在 1.5 中添加,因此您必须将其设置为 1.5 或更高版本。另外我相信只设置 COMPILER_SOURCE

就足够了
Map options = JavaCore.getOptions();
options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5); //or newer version
parser.setCompilerOptions(options);

关于java - Eclipse JDT ASTParser 错误地转换枚举声明节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21924881/

相关文章:

java - 不带注释的 Jersey 验证

Java - 编译后GUI不会运行

compiler-construction - 以可解析格式序列化 AST

c# - 值得将枚举转换为它的值的场景

c++ - boost::spirit 从语义 Action 访问位置迭代器

swift - 如何使用 SwiftSyntax 库递归迭代 Swift Syntax?

java - 为什么 Android 上的 ExifInterface 会出现“文件未找到”错误?

java - 如何比较单个字符串中的元素?

c# - 如何在 C# 中获取下一个(或上一个)枚举值

struct - 我可以将元组结构枚举变体转换为常规元组而不是解构和重新创建元组吗?