diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | core/shared/src/main/scala/magnolia.scala | 30 | ||||
-rw-r--r-- | tests/src/main/scala/tests.scala | 8 |
3 files changed, 29 insertions, 10 deletions
@@ -2,3 +2,4 @@ target .jvm .js .native +.idea/ diff --git a/core/shared/src/main/scala/magnolia.scala b/core/shared/src/main/scala/magnolia.scala index 49b2744..2431e4f 100644 --- a/core/shared/src/main/scala/magnolia.scala +++ b/core/shared/src/main/scala/magnolia.scala @@ -278,16 +278,26 @@ object Magnolia { val preAssignments = caseParams.map(_.typeclass) val defaults = if (!isValueClass) { - val indexedConstructorParams = genericType.decls.collect { - case m: MethodSymbol if m.isCaseAccessor => m.asTerm - }.zipWithIndex - - indexedConstructorParams.map { - case (p, idx) => - if (p.isParamWithDefault) { - val method = TermName("apply$default$" + (idx + 1)) - q"$scalaPkg.Some(${genericType.typeSymbol.companion.asTerm}.$method)" - } else q"$scalaPkg.None" + val constructorParams = genericType.decls.collect { + case a: MethodSymbol if a.isConstructor => a + }.head.paramLists.head.map(_.asTerm) + val noDefaults = constructorParams.forall(!_.isParamWithDefault) + + if (noDefaults) { + constructorParams.map(_ => q"$scalaPkg.None") + } else { + val caseClassCompanion = genericType.companion + val constructorMethod = caseClassCompanion.decl(TermName("apply")).asMethod + val indexedConstructorParams = + constructorMethod.paramLists.head.map(_.asTerm).zipWithIndex + + indexedConstructorParams.map { + case (p, idx) => + if (p.isParamWithDefault) { + val method = TermName("apply$default$" + (idx + 1)) + q"$scalaPkg.Some(${genericType.typeSymbol.companion.asTerm}.$method)" + } else q"$scalaPkg.None" + } } } else List(q"$scalaPkg.None") diff --git a/tests/src/main/scala/tests.scala b/tests/src/main/scala/tests.scala index e453502..6810fc9 100644 --- a/tests/src/main/scala/tests.scala +++ b/tests/src/main/scala/tests.scala @@ -176,5 +176,13 @@ object Tests extends TestApp { test("serialize a value class") { Show.gen[Length].show(new Length(100)) }.assert(_ == "100") + + class ParentClass { + case class InnerClass(name: String) + + test("serialize a case class inside another class") { + implicitly[Show[String, InnerClass]].show(InnerClass("foo")) + }.assert(_ == "InnerClass(name=foo)") + } } } |