aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Pretty <jon.pretty@propensive.com>2017-11-29 15:24:19 +0100
committerGitHub <noreply@github.com>2017-11-29 15:24:19 +0100
commit376c06cb95106de60319a4d62268a94951aab084 (patch)
tree791c5d01e21701a4f28d5ea764ad19a07bdc18bf
parent2332d33b0da2861e958a313bbd1707ab0ce289db (diff)
parent615af3df03f9079691f6aec5992671ae2c08dac9 (diff)
downloadmagnolia-376c06cb95106de60319a4d62268a94951aab084.tar.gz
magnolia-376c06cb95106de60319a4d62268a94951aab084.tar.bz2
magnolia-376c06cb95106de60319a4d62268a94951aab084.zip
Merge pull request #48 from leandrob13/fix/errorWithAlternativeApplyMethods
Fixed derivation error when companion has alternative apply methods
-rw-r--r--.gitignore1
-rw-r--r--core/shared/src/main/scala/magnolia.scala11
-rw-r--r--tests/src/main/scala/tests.scala15
3 files changed, 25 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index e7f1455..63d54ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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 d400bc3..9af9b09 100644
--- a/core/shared/src/main/scala/magnolia.scala
+++ b/core/shared/src/main/scala/magnolia.scala
@@ -280,9 +280,16 @@ object Magnolia {
val defaults = if (!isValueClass) {
val caseClassCompanion = genericType.companion
- val constructorMethod = caseClassCompanion.decl(TermName("apply")).asMethod
+
+ // If a companion object is defined with alternative apply methods
+ // it is needed get all the alternatives
+ val constructorMethods =
+ caseClassCompanion.decl(TermName("apply")).alternatives.map(_.asMethod)
+
+ // The last apply method in the alternatives is the one that belongs
+ // to the case class, not the user defined companion object
val indexedConstructorParams =
- constructorMethod.paramLists.head.map(_.asTerm).zipWithIndex
+ constructorMethods.last.paramLists.head.map(_.asTerm).zipWithIndex
indexedConstructorParams.map {
case (p, idx) =>
diff --git a/tests/src/main/scala/tests.scala b/tests/src/main/scala/tests.scala
index cf31836..4b0e5c1 100644
--- a/tests/src/main/scala/tests.scala
+++ b/tests/src/main/scala/tests.scala
@@ -37,11 +37,26 @@ case object Blue extends Color
case class `%%`(`/`: Int, `#`: String)
+case class Param(a: String, b: String)
+case class Test(param: Param)
+object Test {
+ def apply(): Test = Test(Param("", ""))
+
+ def apply(a: String)(implicit b: Int): Test = Test(Param(a, b.toString))
+
+ def apply(a: String, b: String): Test = Test(Param(a, b))
+}
+
object Tests extends TestApp {
def tests() = for (i <- 1 to 1000) {
import examples._
+ test("construct a Show product instance with alternative apply functions") {
+ import examples._
+ Show.gen[Test].show(Test("a", "b"))
+ }.assert(_ == """Test(param=Param(a=a,b=b))""")
+
test("construct a Show product instance") {
import examples._
Show.gen[Person].show(Person("John Smith", 34))