在scala宏中,如何获取类的完整`extends`子句?

时间:2014-08-19 00:32:59

标签: scala macros scala-macros

鉴于

trait A[T]
class B[T] extends A[Option[T]]

在宏中,我可以看到AB的超类型,BA的子类型,但类型参数的具体情况如何匹配失踪了。

如何获取完整的extends A[Option[T]]信息?

1 个答案:

答案 0 :(得分:6)

我假设你想要这个信息给定的类型,而不是树(这是更容易,但不太一般)。诀窍是使用baseType来获取A的类型实例,这是B的超类型,然后通过与TypeRef匹配来提取其类型参数:

import scala.language.experimental.macros
import scala.reflect.macros.whitebox

def whateverImpl[X: c.WeakTypeTag, Y: c.WeakTypeTag](c: whitebox.Context) = {
  import c.universe._

  val xSymbol = weakTypeOf[X].typeSymbol
  val ySymbol = weakTypeOf[Y].typeSymbol

  ySymbol.typeSignature.baseType(xSymbol) match {
    case TypeRef(_, _, List(arg)) => println(arg)
    case _ => c.abort(c.enclosingPosition, "Types don't work.")
  }

  q"()"
}

def whatever[X, Y]: Unit = macro whateverImpl[X, Y]

trait A[T]
class B[T] extends A[Option[T]]

然后:

scala> whatever[A[_], B[_]]
Option[T]

通过删除whitebox部分,可以轻松地将其调整为2.10。