aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/scala/magnolia.scala
diff options
context:
space:
mode:
authorJon Pretty <jon.pretty@propensive.com>2017-11-10 15:23:38 +0000
committerGitHub <noreply@github.com>2017-11-10 15:23:38 +0000
commit9c90d3f393d18ef0f8f27751a8328913dad7ad25 (patch)
tree345f7f8a497f5fc12e2aaad9cf9e8119e0059d62 /core/src/main/scala/magnolia.scala
parent657d2fb2c16b75c790bf3c3a63d1f830a42893db (diff)
parent2ae9a65ed0b773f77b5cd8d8c134a125bbaccf5d (diff)
downloadmagnolia-9c90d3f393d18ef0f8f27751a8328913dad7ad25.tar.gz
magnolia-9c90d3f393d18ef0f8f27751a8328913dad7ad25.tar.bz2
magnolia-9c90d3f393d18ef0f8f27751a8328913dad7ad25.zip
Merge pull request #27 from propensive/allow-type-constructor-in-supertrait
Allow type constructor in supertrait
Diffstat (limited to 'core/src/main/scala/magnolia.scala')
-rw-r--r--core/src/main/scala/magnolia.scala23
1 files changed, 18 insertions, 5 deletions
diff --git a/core/src/main/scala/magnolia.scala b/core/src/main/scala/magnolia.scala
index 293d0f1..9aa5d5f 100644
--- a/core/src/main/scala/magnolia.scala
+++ b/core/src/main/scala/magnolia.scala
@@ -71,8 +71,21 @@ object Magnolia {
val magnoliaObj = q"$magnoliaPkg.Magnolia"
val arrayCls = tq"_root_.scala.Array"
- val typeConstructor: c.Type =
- c.prefix.tree.tpe.member(TypeName("Typeclass")).asType.toType.typeConstructor
+ val prefixType = c.prefix.tree.tpe
+
+ val typeDefs = prefixType.baseClasses.flatMap { cls =>
+ cls.asType.toType.decls.filter(_.isType).find(_.name.toString == "Typeclass").map { tpe =>
+ tpe.asType.toType.asSeenFrom(prefixType, cls)
+ }
+ }
+
+ val typeConstructorOpt =
+ typeDefs.headOption.map(_.typeConstructor)
+
+ val typeConstructor = typeConstructorOpt.getOrElse {
+ c.abort(c.enclosingPosition,
+ "magnolia: the derivation object does not define the Typeclass type constructor")
+ }
def findType(key: Type): Option[TermName] =
recursionStack(c.enclosingPosition).frames.find(_.genericType == key).map(_.termName(c))
@@ -258,9 +271,9 @@ object Magnolia {
$paramsVal,
($fnVal: Param[$typeConstructor, $genericType] => Any) =>
new $genericType(..${caseParams.zipWithIndex.map {
- case (typeclass, idx) =>
- q"$fnVal($paramsVal($idx)).asInstanceOf[${typeclass.paramType}]"
- } })
+ case (typeclass, idx) =>
+ q"$fnVal($paramsVal($idx)).asInstanceOf[${typeclass.paramType}]"
+ }})
))
}"""
)