J'essaie d'appeler une macro à partir d'une macro, mais je fais quelque chose de mal. Il semble à peu près comme ceci:Appel d'une macro à partir d'une macro
import play.api.libs.json._
import scala.reflect.macros.Context
import language.experimental.macros
object Extension {
def apply[A]: Format[A] = macro applyImpl[A]
def applyImpl[A: c.WeakTypeTag](c: Context): c.Expr[Format[A]] = {
import c.universe._
val aTpeW = c.weakTypeOf[A]
val aClazz = aTpeW.typeSymbol.asClass
if (!aClazz.isSealed) { // fall back to Json.format
val t = reify { Json.format[A] } .tree
return c.Expr[Format[A]](t)
}
???
}
}
En d'autres termes, selon une condition du type de A
, au lieu de générer un arbre dans ma macro, je veux revenir le corps d'une autre macro (Json.format
). Mais d'une manière ou d'une autre, cela se développe déjà avant d'utiliser la macro. Quand je compile, je reçois
[error] .../Extension.scala:47: No unapply function found
[error] val t = reify { Json.format[A] } .tree
[error] ^
Ce qui signifie que format
est déjà exécuté (il ne doit pas être). La méthode format
est définie comme
def format[A] = macro JsMacroImpl.formatImpl[A]