aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorgi Krastev <joro.kr.21@gmail.com>2018-04-14 23:52:12 +0200
committerGeorgi Krastev <joro.kr.21@gmail.com>2018-04-15 00:30:27 +0200
commitb513d441dd05032bb008e67054e6f9cc3d59040e (patch)
treed4ee613a83d3ebed9bd47edd63906c2d9eb5c716
parent60254ec97e06ffe0e460ab02240d03b26271a9c3 (diff)
downloadmagnolia-b513d441dd05032bb008e67054e6f9cc3d59040e.tar.gz
magnolia-b513d441dd05032bb008e67054e6f9cc3d59040e.tar.bz2
magnolia-b513d441dd05032bb008e67054e6f9cc3d59040e.zip
Make Deferred public (but compileTimeOnly)
It is required for the type checking of recursive typeclasses.
-rw-r--r--core/shared/src/main/scala/magnolia.scala16
1 files changed, 7 insertions, 9 deletions
diff --git a/core/shared/src/main/scala/magnolia.scala b/core/shared/src/main/scala/magnolia.scala
index be4c65e..27d2db0 100644
--- a/core/shared/src/main/scala/magnolia.scala
+++ b/core/shared/src/main/scala/magnolia.scala
@@ -14,6 +14,7 @@
*/
package magnolia
+import scala.annotation.compileTimeOnly
import scala.collection.breakOut
import scala.collection.mutable
import scala.language.existentials
@@ -131,7 +132,7 @@ object Magnolia {
checkMethod("combine", "case classes", "CaseClass[Typeclass, _]")
checkMethod("dispatch", "sealed traits", "SealedTrait[Typeclass, _]")
- val removeDeferred = new Transformer {
+ val expandDeferred = new Transformer {
override def transform(tree: Tree) = tree match {
case q"$magnolia.Deferred.apply[$_](${Literal(Constant(method: String))})"
if magnolia.symbol == magnoliaPkg =>
@@ -402,12 +403,8 @@ object Magnolia {
val result = stack
.find(searchType)
- .map { enclosingRef =>
- q"$magnoliaPkg.Deferred[$searchType](${enclosingRef.toString})"
- }
- .orElse {
- directInferImplicit(genericType, typeConstructor)
- }
+ .map(enclosingRef => q"$magnoliaPkg.Deferred[$searchType](${enclosingRef.toString})")
+ .orElse(directInferImplicit(genericType, typeConstructor))
for (tree <- result) if (debug.isDefined && genericType.toString.contains(debug.get)) {
c.echo(c.enclosingPosition, s"Magnolia macro expansion for $genericType")
@@ -416,7 +413,7 @@ object Magnolia {
val dereferencedResult =
if (stack.nonEmpty) result
- else for (tree <- result) yield c.untypecheck(removeDeferred.transform(tree))
+ else for (tree <- result) yield c.untypecheck(expandDeferred.transform(tree))
dereferencedResult.getOrElse {
c.abort(c.enclosingPosition,
@@ -480,7 +477,8 @@ object Magnolia {
private[magnolia] final case class DirectlyReentrantException()
extends Exception("attempt to recurse directly")
-private[magnolia] object Deferred { def apply[T](method: String): T = ??? }
+@compileTimeOnly("magnolia.Deferred is used for derivation of recursive typeclasses")
+object Deferred { def apply[T](method: String): T = ??? }
private[magnolia] object CompileTimeState {