Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Syntax error , insert "EnumBody" to complete EnumDeclaration

I was in middle of coding and accidentally put the following line of code at the part of class where we declare instance variables. but i checked and it gives the same error anywhere by anywhere i mean : inside a static block, inside constructor, inside any class method. except when private; is put as the first line of the class it gives Syntax error, insert "EnumBody" to complete ClassBodyDeclarations (as written by @chaitanya10 in comments below and also verified by me on my workspace) error in eclipse tooltip when we hover cursor over it.

I understand there is error.
but I dont understand the error message when i hover cursor over the error. what is the meaning of this message?

why does it expecting EnumBody ?

Below is the screenshot.

enter image description here

like image 552
Mukul Goel Avatar asked Nov 01 '12 07:11

Mukul Goel


3 Answers

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.

like image 187
Stephen C Avatar answered Nov 12 '22 16:11

Stephen C


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.

like image 33
durron597 Avatar answered Nov 12 '22 15:11

durron597


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

like image 1
Mason Avatar answered Nov 12 '22 16:11

Mason