Syntax error , insert "EnumBody" to complete EnumDeclaration
This was happening to me in Eclipse too even though my code was correct. Happened because I wrote some code without adding a jar first (aspectJ JARs) and after I added the JAR this issue came about.
At first I copied the code, deleted it, and pasted it back in and thought that worked as the red line went away but errors were thrown at runtime. I did however get it to work by deleting the class, recreating it, and typing the same exact code again and it worked. Copy paste probably would have worked after deleting the class, but I typed it out to be sure.
Definitely a weird problem. I knew the code was right because I was copying it out of a book (Spring in action 4th edition - a good read btw). Anyway, hope this helps you or someone in the future! drove me crazy for about an hour
For a real explanation, someone would need to do a detailed analysis of the syntax checking, and the syntax error recovery and reporting components of the Eclipse Java compiler front end. But the most likely explanation is that your "unusual" syntax error has "confused" the compiler's syntax error recovery code.
In short it is a minor compiler bug (or feature).
It is possible that the developers know about this, but have refrained from fixing it because of one or more of the following:
- It doesn't happen often enough to be prioritized.
- It might be hard to do a better job without affecting other error recovery cases.
- Any change could break1 a number of compiler error regression tests.
- There are other higher priority issues to deal with.
1 - Break ... in the sense of causing tests to fail because of assumptions in the test rather than problems in the code being tested. Fixing these regressions could be burdensome.
For what it's worth, the following:
public class Foo;
Error: Syntax error, insert "ClassBody" to complete ClassBodyDeclarations
public enum Foo;
Error: Syntax error, insert "EnumBody" to complete ClassBodyDeclarations
public interface Foo;
Error Syntax error, insert "InterfaceBody" to complete ClassBodyDeclarations
Anyway, I think what happens is, in this
org.eclipse.jdt.internal.compiler.parser.Parser.consumeEnumConstantHeader()
, it tries to recover when it gets the parsing error with this code:
if(this.currentToken == TokenNameSEMICOLON) {
RecoveredType currentType = currentRecoveryType();
if(currentType != null) {
currentType.insideEnumConstantPart = false;
}
}
So it correctly figures out that we're not inside an enumeration, so we get an error like above, but it doesn't realize that we don't even know if it is an enumeration. You can look at the source here:
In other words, it's probably a bug that the Eclipse team introduced when they added Enumerations, it's handled slightly differently than some of the other tokens, which causes it to be Recovered in a different way and therefore shows up in the compiler errors.