2013-06-18 8 views
1

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] 

Répondre

1

Il faut sauter à droite dans le corps de la macro il semble:

if (!aClazz.isSealed) { // fall back to Json.format 
    return JsMacroImpl.formatImpl[A](c) 
} 

(IntelliJ avait ce rouge, donc je pensais qu'il était faux, mais il compile en fait)

1

Vous pouvez également appeler la macro à partir d'une macro lorsque vous placez les deux macros dans différentes unités de compilation (c'est-à-dire des projets différents). Scala ne peut pas compiler une macro et l'appliquer dans la même compilation.

Questions connexes