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.enclosingClassc.enclosingMethodc.macroApplication

ただし、タイプチェッカーはタイプチェックされるツリーを大幅に再ハッシュできるため、このアプローチはおそらくあまり堅牢ではありませんc.macroApplication。誰かがこれらの問題を抱えていたことを覚えていますが、私はこのアプローチを自分で試したことはありません.

于 2013-01-15T00:01:16.587 に答える