3

我试图从宏中调用宏,但我做错了。它看起来大约是这样的:

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]
4

2 回答 2

2

似乎需要直接跳入宏体:

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

(IntelliJ有这个红色,所以我认为它是错误的,但它实际上编译)

于 2013-06-18T09:11:28.387 回答
2

或者,当您将两个宏放在不同的编译单元(即不同的项目)中时,您应该能够从宏中调用宏。Scala 无法编译宏并将其应用于同一编译运行。

于 2013-06-18T10:46:06.450 回答