1

以下代码获取调用函数(如 C _ _ FUNC _ _):

def __func__(c: Context) = {
    import c.universe._
    c.enclosingMethod match {
        case DefDef(mods, name, tparams, vparamss, tpt, rhs) =>
            c.universe.reify(println(
                "\n  mods "+c.literal(mods.toString).splice
                +"\n  name "+c.literal(name.toString).splice
                +"\n  tparams "+c.literal(tparams.toString).splice
                +"\n  vparamss "+c.literal(vparamss.toString).splice
                +"\n  tpt "+c.literal(tpt.toString).splice
                +"\n  rhs "+c.literal(rhs.toString).splice
            ))
        case _ => c.abort(c.enclosingPosition, "NoEnclosingMethod")
    }
}

但是如何获得更多的深度,即获取调用宏的函数的函数的名称?

提前感谢您的帮助。

4

1 回答 1

3

您可以尝试检查c.enclosingUnit或更简单的东西,例如c.enclosingClassor c.enclosingMethod。获得外壳后,您可以遍历它并尝试检测您的c.macroApplication.

然而,这种方法可能不是很健壮,因为类型检查器可以显着地重新散列被类型检查的树,因此您将无法c.macroApplication在预类型器封闭树中找到后类型器。我记得有人遇到过这些问题,但我自己没有尝试过这种方法。

于 2013-01-15T00:01:16.587 回答