diff options
author | Jon Pretty <jon.pretty@propensive.com> | 2017-10-30 13:58:33 +0100 |
---|---|---|
committer | Jon Pretty <jon.pretty@propensive.com> | 2017-10-30 13:58:33 +0100 |
commit | 86c66ba93b5dc15301ac305fa28e24952e232613 (patch) | |
tree | 74e943910b29dfcae31ef8f943eb96eebcb34813 /core/src/main/scala/magnolia.scala | |
parent | 8edaa6e2adbb4aa724a7829be5003fdabb01628a (diff) | |
download | magnolia-86c66ba93b5dc15301ac305fa28e24952e232613.tar.gz magnolia-86c66ba93b5dc15301ac305fa28e24952e232613.tar.bz2 magnolia-86c66ba93b5dc15301ac305fa28e24952e232613.zip |
All variants now deriving
Though there's a stack overflow when trying to derive a `Decoder`.
Diffstat (limited to 'core/src/main/scala/magnolia.scala')
-rw-r--r-- | core/src/main/scala/magnolia.scala | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/core/src/main/scala/magnolia.scala b/core/src/main/scala/magnolia.scala index 9da9f1e..c4c8113 100644 --- a/core/src/main/scala/magnolia.scala +++ b/core/src/main/scala/magnolia.scala @@ -20,6 +20,12 @@ trait Param[Tc[_], T] { def dereference(param: T): S } +trait JoinContext[Tc[_], T] { + def construct[R](param: ((Param[Tc, T]) => Any)): T + def typeName: String + def parameters: List[Param[Tc, T]] +} + object Magnolia { import CompileTimeState._ @@ -156,10 +162,17 @@ object Magnolia { }""" } - val constructor = q"null" //q"""{ => new ${}(..$params) }""" + val constructor = q"""new $genericType(..${callables.zip(implicits).map { case (call, imp) => + q"fn($call).asInstanceOf[${imp._1.returnType}]" + } })""" val impl = q""" - ${c.prefix}.join(${constructor}, $className, _root_.scala.List(..$callables)) + ${c.prefix}.join(new _root_.magnolia.JoinContext[$typeConstructor, $genericType] { + def construct[R](fn: ((Param[${typeConstructor}, $genericType]) => Any)): $genericType = $constructor + def typeName: _root_.java.lang.String = $className + def parameters: _root_.scala.List[Param[$typeConstructor, $genericType]] = + _root_.scala.List(..$callables) + }) """ q""" |