circe-magnolia
circe-magnolia copied to clipboard
`StackOverflowException` when deriving alternating recursion structure
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)
Is this a known issue? Any pointers where the fix could be? Is this a limitation of Magnolia, or circe-magnolia?