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
  )
)

このようなものをデバッグする簡単な方法の1つは、予期しないものを取得した場合の生の表現を印刷することです。

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

これにより、シングルトンオブジェクト内で呼び出されたときに次のように出力されます。

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

これにより、どこから始めればよいかがわかります。

于 2013-01-17T11:37:57.143 に答える