在 Scala 宏注释中获取给定类型的 WeakTypeTag

Obtaining a WeakTypeTag for a given type in a Scala macro annotation

我正在编写一个 Scala 宏注解 @model 用于注解我的案例 classes 并且它会自动将一些元数据添加到注解 class 的伴生对象中,基于注释案例的字段 class.

我想获得更多关于 case class 参数类型的信息,特别是检查它们是否实现了某个特征。我认为为他们获得一个 WeakTypeTag 是可行的方法,但我似乎无法获得它们在 def 宏中获得的方式。

具体地说:在这种情况下,我希望能够从 @model 的宏实现中看出 User class 的 address 字段具有一种扩展了 ModelObjectdate 没有的类型。我可以这样做吗?

trait ModelObject
@model case case Address(street: String, city: String) extends ModelObject
@model case class User(name: String, since: Date, address: Address) extends ModelObject

进入宏注释参数的树是有意无类型的。但是 运行 c.typeCheck(q"(??? : <tree that represents the parent>)").tpe 将提供缺失的信息。不要忘记在类型检查之前 duplicate 那棵树,因为 c.typeCheck 会在适当的位置改变树,这可能是不希望的。

c.typeCheck 的功能有限。有关这方面的一些示例,请参阅 Can't access Parent's Members while dealing with Macro Annotations.