获得具有更多层次深度的调用函数

时间:2013-01-09 21:04:35

标签: scala-2.10 scala-macros

以下代码获取调用函数(如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")
    }
}

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您可以尝试检查c.enclosingUnit或更简单的内容,例如c.enclosingClassc.enclosingMethod。获得机箱后,您可以遍历它并尝试检测c.macroApplication的父母。

然而,这种方法可能不会非常强大,因为类型检查器可以显着地重新检查被类型检查的树,因此您无法在封闭树的封闭树中找到post-typer c.macroApplication。我记得有人遇到过这些问题,但我自己并没有尝试过这种方法。