作为宏的一部分,我需要检查案例定义的模式。
有没有办法确定模式变量的类型,甚至是整个模式?
考虑多态类Data
和一个使用转换器检查和转换Data
值模式的宏:
case class Data[A](x: String, data: A)
def macroImpl(c: Context)(...) = {
val transformer = new Transformer {
override def transformCaseDefs(trees: List[CaseDef]) = trees map {
case CaseDef(pattern, guard , body) => pattern match {
case pq"Data($string, $data)" => {
// What is the type of $data, i.e., how
// is the type parameter A instantiated?
...
}
}
}
}
...
transformer.transform(...)
}
有没有办法确定模式变量$data的类型,即确定类型参数A是如何被实例化的?
另一个问题讨论了值树的这个问题,并建议使用该c.typeCheck
函数。不幸的是,这似乎不适用于模式,因为该方法在应用于上述示例的模式树时typeCheck
会抛出 a 。TypeCheckException