Eclipse JDT ASTParser неправильно преобразовал узел объявления перечисления
Я работаю над анализом кода Java с использованием JDT и собираюсь создать автономный инструмент анализа, зависящий от пакета org.eclipse.jdt.core вместо подключаемого модуля eclipse. Но я обнаружил, что мой инструмент не работал правильно на узле объявления enum, который появился в коде Java. В моем AST, созданном jdt, ключевое слово enum рассматривалось как typename вместо объявления 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 ответ
Как вы ответили себе, вы должны установить более новую версию компилятора, потому что по умолчанию 1,3
Map options = JavaCore.getOptions();
System.out.println(options.get(JavaCore.COMPILER_SOURCE)); //outputs 1.3
Однако (я думаю) объявление enum было добавлено только в 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);