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

标签 scala macros scala-macros

给定的

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

在宏中,我可以看到 AB 的父类(super class)型和 BA 的子类型,但缺少类型参数如何匹配的细节。

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

最佳答案

我假设您需要给定类型的信息,而不是树(这比较容易,但不太通用)。诀窍是使用 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部分。

关于scala - 在 Scala 宏中,如何获取类的完整 `extends` 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374041/

相关文章:

performance - Scala 库的自动性能测试

c++ - 传递要动态查找的成员

macros - 迭代创建局部变量?

中缀位置的Scala无类型宏

scala - 如何将准引号与先前定义的对象一起使用

scala - 为什么部分应用函数会延迟 Scala 中的类实例化?

scala - Spark on AWS EMR : java. lang.NoSuchMethodError : scala. Product.$init$(Lscala/Product;)V

c - 如何在 linux C 内联汇编中使用宏

scala - 从 Scala 宏访问代码文件和行号?

scala - 基于使用 scala 对元素进行分组的元素总和?