在宏中查找方法参数的实际类型

时间:2014-05-03 16:22:17

标签: scala scala-macros

假设我有一个宏实现

def testImpl[T](c:Context)(implicit wtt:c.WeakTypeTag[T]):c.Tree = {
    import c.universe._

    def info(msg: Any) = c.info(c.enclosingPosition, msg.toString, true)

    val parameter = wtt.tpe.member(TermName("f")).paramLists(0)(0)

    info(parameter.typeSignature)

    q"{}"
}

宏定义

def test[T]:Unit = macro DerivingImpl.testImpl[T]

此宏在其类型参数中查找函数f,并打印有关其第一个参数类型的信息。

现在如果我像这样使用这个宏

trait Trait[A] {
    def f(x:A): Int
}

test[Trait[Int]]

我打印A。我想得到Int。我理解调用member会返回方法符号,该符号没有关于具体应用类型的信息。那么,找到参数的实际类型的正确方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:5)

val f = wtt.tpe.member(TermName("f"))
val MethodType(parameter :: Nil, _) = f.typeSignatureIn(wtt.tpe)
info(parameter.typeSignature)