マクロからマクロを呼び出そうとしていますが、何か間違っています。おおよそ次のようになります。
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)
}
???
}
}
つまり、 のタイプの何らかの条件に基づいてA
、マクロでツリーを生成する代わりに、別のマクロ ( ) の本体を返したいと考えていJson.format
ます。しかし、どういうわけか、これはマクロを使用する前にすでに展開されています。これをコンパイルすると、
[error] .../Extension.scala:47: No unapply function found
[error] val t = reify { Json.format[A] } .tree
[error] ^
これは、format
すでに実行されていることを意味します (実行されるべきではありません)。メソッドは次のformat
ように定義されます。
def format[A] = macro JsMacroImpl.formatImpl[A]