4

我想获取宏的调用类,但我的代码不起作用:

def __CLASS__(c: Context) = {
    import c.universe._
    c.enclosingClass match {
    case ClassDef(mods, name, tparams, impl) =>
    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  impl "+c.literal(impl.toString).splice
            ))
    case _ => c.abort(c.enclosingPosition, "NoEnclosingClass")
    }
}

在此先感谢您的帮助。

4

1 回答 1

5

当从类的普通实例内部调用时,这将按原样工作,因此我假设您是从对象内部尝试它,在这种情况下,您需要匹配ModuleDef以及ClassDef

case ModuleDef(mods, name, impl) => c.universe.reify(
  printf(
    "\n  mods %s\n  name %s\n  impl %s\n",
    c.literal(mods.toString).splice,
    c.literal(name.toString).splice,
    c.literal(impl.toString).splice
  )
)

请注意,调试这样的事情的一种简单方法是打印出你得到的任何意想不到的东西的原始表示:

case x => c.abort(c.enclosingPosition, "NoEnclosingClass: " + showRaw(x))

当在单例对象中调用时,这将打印以下内容:

<console>:7: error: NoEnclosingClass: ModuleDef(Modifiers(), ...

这让我们很好地了解了我们需要从哪里开始。

于 2013-01-17T11:37:57.143 回答