aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Krzemiński <pio.krzeminski@gmail.com>2017-06-21 13:38:20 +0100
committerPiotr Krzemiński <pio.krzeminski@gmail.com>2017-06-21 13:38:20 +0100
commit64f817404963d6222fae91ccd259e497c5023e3e (patch)
tree16e9344627902d2b76eb855663676426c798f3a8
parent2b4ef02a92e431b16d9b314def1da204fd1f9ab1 (diff)
downloadmagnolia-64f817404963d6222fae91ccd259e497c5023e3e.tar.gz
magnolia-64f817404963d6222fae91ccd259e497c5023e3e.tar.bz2
magnolia-64f817404963d6222fae91ccd259e497c5023e3e.zip
defined DerivationImplicit
-rw-r--r--core/src/main/scala/magnolia.scala29
1 files changed, 18 insertions, 11 deletions
diff --git a/core/src/main/scala/magnolia.scala b/core/src/main/scala/magnolia.scala
index 4ce2ec3..f96f23e 100644
--- a/core/src/main/scala/magnolia.scala
+++ b/core/src/main/scala/magnolia.scala
@@ -12,6 +12,13 @@ class Macros(val c: whitebox.Context) {
import c.universe._
import CompileTimeState._
+
+ sealed trait DerivationImplicit { def tree: Tree }
+ case class CovariantDerivationImplicit(tree: Tree) extends DerivationImplicit
+ case class ContravariantDerivationImplicit(tree: Tree) extends DerivationImplicit
+ case class ContravariantDerivation2Implicit(tree: Tree) extends DerivationImplicit
+
+
private def findType(key: Type): Option[TermName] =
recursionStack(c.enclosingPosition).frames.find(_.genericType == key).map(_.termName(c))
@@ -43,7 +50,7 @@ class Macros(val c: whitebox.Context) {
genericType: Type,
typeConstructor: Type,
assignedName: TermName,
- derivationImplicit: Either[Tree, Tree]): Tree = {
+ derivationImplicit: DerivationImplicit): Tree = {
val searchType = appliedType(typeConstructor, genericType)
findType(genericType).map { methodName =>
@@ -75,7 +82,7 @@ class Macros(val c: whitebox.Context) {
private def directInferImplicit(genericType: Type,
typeConstructor: Type,
- derivationImplicit: Either[Tree, Tree]): Option[Tree] = {
+ derivationImplicit: DerivationImplicit): Option[Tree] = {
val genericTypeName: String = genericType.typeSymbol.name.encodedName.toString.toLowerCase
val assignedName: TermName = TermName(c.freshName(s"${genericTypeName}Typeclass"))
@@ -106,10 +113,10 @@ class Macros(val c: whitebox.Context) {
}
derivationImplicit match {
- case Left(impl) =>
+ case CovariantDerivationImplicit(impl) =>
val dereferencedValue = q"$impl.dereference(sourceParameter, ${param.name.toString})"
q"$impl.call($derivedImplicit, $dereferencedValue)"
- case Right(impl) =>
+ case ContravariantDerivation2Implicit(impl) =>
// val paramName = TermName(param.name.toString)
// val dereferencedValue = q"sourceParameter.$paramName"
// q"$impl.call($derivedImplicit, $dereferencedValue)"
@@ -124,9 +131,9 @@ class Macros(val c: whitebox.Context) {
}
derivationImplicit match {
- case Left(_) =>
+ case CovariantDerivationImplicit(_) =>
Some(q"new $genericType(..$implicits)")
- case Right(impl) =>
+ case ContravariantDerivation2Implicit(impl) =>
val namedImplicits = caseClassParameters.zip(implicits).map { case (param, tree) =>
q"(${param.name.encodedName.toString}, $tree)"
}
@@ -152,10 +159,10 @@ class Macros(val c: whitebox.Context) {
}
derivationImplicit match {
- case Left(impl) =>
+ case CovariantDerivationImplicit(impl) =>
val reduction = components.reduce { (left, right) => q"$impl.combine($left, $right)" }
q"$impl.call($reduction, sourceParameter)"
- case Right(impl) =>
+ case ContravariantDerivation2Implicit(impl) =>
val parts = subtypes.tail.zip(components.tail)
@@ -185,7 +192,7 @@ class Macros(val c: whitebox.Context) {
} else None
construct.map { const =>
- val impl = derivationImplicit.merge
+ val impl = derivationImplicit.tree
// q"""{
// def $assignedName: $resultType = $impl.construct { sourceParameter => $const }
// $assignedName
@@ -215,10 +222,10 @@ class Macros(val c: whitebox.Context) {
val contraDerivation2Type = appliedType(contraDerivation2Typeclass, List(typeConstructor))
val derivationImplicit = try {
- Left(c.untypecheck(c.inferImplicitValue(coDerivationType, false, false)))
+ CovariantDerivationImplicit(c.untypecheck(c.inferImplicitValue(coDerivationType, false, false)))
} catch {
case e: Exception =>
- try Right(c.untypecheck(c.inferImplicitValue(contraDerivation2Type, false, false))) catch {
+ try ContravariantDerivation2Implicit(c.untypecheck(c.inferImplicitValue(contraDerivation2Type, false, false))) catch {
case e: Exception =>
c.info(c.enclosingPosition, s"could not find an implicit instance of "+
s"CovariantDerivation[$typeConstructor] or "+