aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Krzemiński <pio.krzeminski@gmail.com>2017-06-22 09:18:00 +0100
committerPiotr Krzemiński <pio.krzeminski@gmail.com>2017-06-22 09:18:00 +0100
commited7010d896a5eb0ff3c182b67ce7cf6c0fad7b44 (patch)
treea97289ef922810eaff29757da57d8fc4f5a54a90
parent6bf80848cd0e729fc37998314c06dd26a4e230bf (diff)
downloadmagnolia-ed7010d896a5eb0ff3c182b67ce7cf6c0fad7b44.tar.gz
magnolia-ed7010d896a5eb0ff3c182b67ce7cf6c0fad7b44.tar.bz2
magnolia-ed7010d896a5eb0ff3c182b67ce7cf6c0fad7b44.zip
refactor
-rw-r--r--core/src/main/scala/magnolia.scala33
1 files changed, 19 insertions, 14 deletions
diff --git a/core/src/main/scala/magnolia.scala b/core/src/main/scala/magnolia.scala
index 61a00d6..27172d3 100644
--- a/core/src/main/scala/magnolia.scala
+++ b/core/src/main/scala/magnolia.scala
@@ -191,6 +191,8 @@ class Macros(val c: whitebox.Context) {
construct.map { const =>
derivationImplicit match {
+ case CovariantDerivationImplicit(_) =>
+ ???
case ContravariantDerivation1Implicit(impl) =>
q"""{
def $assignedName: $resultType = $impl.construct { sourceParameter => $const }
@@ -206,6 +208,7 @@ class Macros(val c: whitebox.Context) {
}
def magnolia[T: WeakTypeTag, Typeclass: WeakTypeTag]: Tree = {
+ import scala.util.{Try, Success, Failure}
val genericType: Type = weakTypeOf[T]
val currentStack: Stack = recursionStack.get(c.enclosingPosition).getOrElse(Stack(List(), List()))
@@ -220,20 +223,22 @@ class Macros(val c: whitebox.Context) {
val contraDerivationType = appliedType(contraDerivationTypeclass, List(typeConstructor))
val contraDerivation2Type = appliedType(contraDerivation2Typeclass, List(typeConstructor))
-
- val derivationImplicitTry = scala.util.Try[DerivationImplicit](CovariantDerivationImplicit(c.untypecheck(c.inferImplicitValue(coDerivationType, false, false))))
- .orElse(scala.util.Try(ContravariantDerivation1Implicit(c.untypecheck(c.inferImplicitValue(contraDerivationType, false, false)))))
- .orElse(scala.util.Try(ContravariantDerivation2Implicit(c.untypecheck(c.inferImplicitValue(contraDerivation2Type, false, false)))))
-
- val derivationImplicit: DerivationImplicit = if(derivationImplicitTry.isFailure) {
- c.info(c.enclosingPosition, s"could not find an implicit instance of "+
- s"CovariantDerivation[$typeConstructor] or "+
- s"ContravariantDerivation[$typeConstructor] or "+
- s"ContravariantDerivation2[$typeConstructor]", true)
- throw derivationImplicitTry.failed.get
- } else {
- derivationImplicitTry.get
- }
+ def findDerivationImplicit[T <: DerivationImplicit](tpe: c.Type, cons: Tree => T): Try[DerivationImplicit] =
+ Try(cons(c.untypecheck(c.inferImplicitValue(tpe, false, false))))
+
+ val derivationImplicit =
+ findDerivationImplicit(coDerivationType, CovariantDerivationImplicit)
+ .orElse(findDerivationImplicit(contraDerivationType, ContravariantDerivation1Implicit))
+ .orElse(findDerivationImplicit(contraDerivation2Type, ContravariantDerivation2Implicit)) match {
+ case Failure(e) =>
+ c.info(c.enclosingPosition, s"could not find an implicit instance of "+
+ s"CovariantDerivation[$typeConstructor] or "+
+ s"ContravariantDerivation[$typeConstructor] or "+
+ s"ContravariantDerivation2[$typeConstructor]", true)
+ throw e
+ case Success(di) =>
+ di
+ }
if(directlyReentrant) throw DirectlyReentrantException()