作为宏的一部分,我需要检查案例定义的模式。
有没有办法确定模式变量的类型,甚至是整个模式?
考虑多态类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的方法?
另一个question讨论了值树的这个问题,并建议使用c.typeCheck
函数。遗憾的是,这似乎不适用于模式,因为typeCheck
方法在应用于上述示例的模式树时会抛出TypeCheckException
。