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

Owe*_*wen 4 macros scala scala-macros

特定

trait A[T]
class B[T] extends A[Option[T]]
Run Code Online (Sandbox Code Playgroud)

在宏中,我可以看到它A是超类型B并且B是子类型A,但缺少类型参数如何匹配的细节.

我怎样才能获得完整的extends A[Option[T]]信息?

Tra*_*own 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]]
Run Code Online (Sandbox Code Playgroud)

然后:

scala> whatever[A[_], B[_]]
Option[T]
Run Code Online (Sandbox Code Playgroud)

通过移除whitebox零件,可以轻松地将其调整为2.10 .