我正在使用 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);