匹配类型参数的quasiquote的类型是什么?

时间:2013-09-15 15:33:27

标签: scala scala-macros shapeless scala-quasiquotes

我有一个quoasiquote匹配器q"someMethod[$ts]()"其中def someMethod[I <: shapeless.HList]()"

打印ts给出:

List(shapeless.HNil)

或者,例如

List(String, Int)

然后我尝试分配:

val types: List[scala.reflect.api.Types.Type] = ts

导致编译器错误:

[error] type mismatch;
[error]  found   : List[_125.u.Tree] where val _125: scala.reflect.api.QuasiquoteCompat.TypeAppliedExtractor{val u: OpTreeContext.this.c.universe.type}
[error]  required: List[Context.this.c.universe.Type]

如何从List[scala.reflect.api.Types.Type]撰写ts

1 个答案:

答案 0 :(得分:3)

正如您的错误消息所述,ts是树的列表。更具体地说,这些将是type trees,您可以使用tpe方法提取其类型:

val types: List[scala.reflect.api.Types#Type] = ts.map(_.tpe)

请注意,我正在使用类型投影,因为Types既不是包也不是对象,因此Types.Type将不起作用。