I am experimenting with eclipse jdt AST and am running into a strange behaviour that I can find no explanation for.
Here is my example code:
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);
}
}
As you can see, I am defining a very simple example class that has an inner enum class where both classes have a method with the same signature.
Strangely though the output of this code (i.e. the parsed TypeDeclaration
) is
class Foo {
enum Bar;
{
}
int getValue(){
return 4;
}
{
}
int getValue(){
return 42;
}
}
For some reason, the body of the TypeDeclaration
consists of:
FieldDeclaration
: enum Bar;
Initializer
: {}
MethodDeclaration
: int getValue(){ return 4; }
Initializer
: {}
MethodDeclaration
: int getValue(){ return 42; }
This leads to my actual code throwing an error because it looks like there are two methods with identical signature.
Why am I not getting the enum as an actual EnumDeclaration
with inner methods but rather it looks like the method inside the enum is actually declared in the outer class itself?
I do not think that this is a bug because the AST View in eclipse handles a similar class perfectly fine, but I cannot figure out what I am doing wrong. Enabling binding resolution did not help.
You need to set compiler options by calling parser.setCompilerOptions
, so that the source file is processed correctly.
Since you are using the enum
keyword, you need at least Java 5 compliance:
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());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With