diff options
author | Shadaj Laddad <shadaj@users.noreply.github.com> | 2017-11-21 10:23:09 -0800 |
---|---|---|
committer | Shadaj Laddad <shadaj@users.noreply.github.com> | 2017-11-21 10:23:09 -0800 |
commit | ebeca9258d5e629327abbcf67e0066a4cdeac173 (patch) | |
tree | 87ded4ccaf2a05d5fc3ccfa8e795104812647520 | |
parent | 5052e8c1a1a0c272c0406165e04bef3c89788d59 (diff) | |
download | magnolia-ebeca9258d5e629327abbcf67e0066a4cdeac173.tar.gz magnolia-ebeca9258d5e629327abbcf67e0066a4cdeac173.tar.bz2 magnolia-ebeca9258d5e629327abbcf67e0066a4cdeac173.zip |
Add unit tests and fix behavior with default parameters
-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)") + } } } |