Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] StackOverflowError in Eclipse #3302

Open
DarioArena87 opened this issue Nov 21, 2022 · 5 comments
Open

[BUG] StackOverflowError in Eclipse #3302

DarioArena87 opened this issue Nov 21, 2022 · 5 comments

Comments

@DarioArena87
Copy link

DarioArena87 commented Nov 21, 2022

Describe the bug
Hi,
on a fresh install of Eclipse 2022-09 i installed the Lombok javaagent but now when i open the IDE i get a StackOverflowError:

Message: Lombok annotation handler class lombok.eclipse.handlers.HandleData failed

Error stacktrace:

java.lang.StackOverflowError
at java.base/java.util.IdentityHashMap.hash(IdentityHashMap.java:299)
at java.base/java.util.IdentityHashMap.put(IdentityHashMap.java:430)
at lombok.core.AST.setAndGetAsHandled(AST.java:157)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:525)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)
at lombok.core.AST.buildWithField(AST.java:292)
at lombok.eclipse.EclipseAST.drill(EclipseAST.java:532)
at lombok.eclipse.EclipseAST.buildStatement(EclipseAST.java:527)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:367)
at lombok.eclipse.EclipseAST.buildTree(EclipseAST.java:1)
at lombok.core.AST.buildWithField0(AST.java:394)

Session data:
eclipse.buildId=4.25.0.I20220831-1800
java.version=17.0.5
java.vendor=Eclipse Adoptium
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=it_IT
Framework arguments: -product org.eclipse.epp.package.jee.product
Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.jee.product

To Reproduce
I don't really know if it's something related to some code in particular. I just downloaded Eclipse and installed the lombok plugin and now i get this error. I opened a springboot project made with spring initializr where i have included lombok as well

Expected behavior
No StackOverflowErrors

Version info (please complete the following information):

  • Lombok version v1.18.24
  • Platform: Eclipse Version: 2022-09 (4.25.0)
@Rawi01
Copy link
Collaborator

Rawi01 commented Nov 21, 2022

This usually happens if there is a really long method invocation chain in some of your files.

@DarioArena87
Copy link
Author

Hi @Rawi01, thanks. My code is pretty standard: it is a very simple REST api made using Spring MVC that reads a Lombok annotated entity via a JPA repository that is directly injected in the Rest Controller (Constructor injection). The entity is pretty big (almost 500 fields sic!) but it is "flat" (no nested classes) and in the future some of the field could change type and/or name so i used Lombok to "shrink" such kind of file and minimize the possibility of introducing errors (misnamed getters and setters, equals and hashcode contract...). Maybe could this be the cause? If i use another IDE like Intellij IDEA or even directly a maven build from the command line there is no such problem and lombok works perfectly. It seems like the problem is caused by the Eclipse AST build that in turn delegates to maven build and something in the middle causes an infinite recursion when Lombok is involved in building the AST.

@janrieke
Copy link
Contributor

You could try increasing the stack size using the -Xss parameter when starting eclipse.

@Rawi01
Copy link
Collaborator

Rawi01 commented Nov 22, 2022

@janrieke Good idea, that should fix the problem
@DarioArena87 I can reproduce the problem if I use @ToString and a lot of fields. If you do not need the generated toString method you can implement it yourself or reduce the amount of included fields by adding @ToString(onlyExplicitlyIncluded = true)

@DarioArena87
Copy link
Author

DarioArena87 commented Nov 23, 2022

You are both right! I had my entities annotated with

@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@FieldDefaults(level = AccessLevel.PRIVATE)

Changing them to

@Getter @Setter
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@FieldDefaults(level = AccessLevel.PRIVATE)

such that the toString() method is not overridden fixed the problem!
Increasing stack size also made the trick but i don't really need the toString() method overridden so i got back to the defaults and it works anyway.
Maybe, if it's not too hard, we could introduce a limit on the recursion caused in Eclipse by the @ToString annotation? (I know my case is really uncommon but it could happen)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants