circe-magnolia icon indicating copy to clipboard operation
circe-magnolia copied to clipboard

`StackOverflowException` when deriving alternating recursion structure

Open s-nel opened this issue 2 years ago • 0 comments

When deriving codecs when there is an alternating cyclic recursive structure I get a StackOverflowException even with lazy val

E.g.

case class RecursiveCycleAExample(b: Option[RecursiveCycleBExample])
case class RecursiveCycleBExample(a: Option[RecursiveCycleAExample])

implicit lazy val decodeRecursiveCycleAExample: Decoder[RecursiveCycleAExample] = deriveMagnoliaDecoder
implicit lazy val encodeRecursiveCycleAExample: Encoder[RecursiveCycleAExample] = deriveMagnoliaEncoder
implicit lazy val decodeRecursiveCycleBExample: Decoder[RecursiveCycleBExample] = deriveMagnoliaDecoder
implicit lazy val encodeRecursiveCycleBExample: Encoder[RecursiveCycleBExample] = deriveMagnoliaEncoder
[error] java.lang.StackOverflowError
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample$lzycompute(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample$lzycompute(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample$lzycompute(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample$lzycompute(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample$lzycompute(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample$lzycompute(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample$lzycompute(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample$lzycompute(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample$lzycompute(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample$lzycompute(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample(SemiautoDerivedSuite.scala:37)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample$lzycompute(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleBExample(SemiautoDerivedSuite.scala:40)
[error] 	at io.circe.magnolia.SemiautoDerivedSuite.decodeRecursiveCycleAExample$lzycompute(SemiautoDerivedSuite.scala:37)

Repro test

Is this a known issue? Any pointers where the fix could be? Is this a limitation of Magnolia, or circe-magnolia?

s-nel avatar Jul 31 '22 03:07 s-nel