如何通过q​​uasiquotes或deconstructors匹配`universe#Type`?

时间:2013-09-11 07:38:26

标签: scala scala-macros scala-quasiquotes

我的resultType类型为Context.this.type#c#universe#Type。我需要将它与Unit类型匹配。我试过了

resultType match {
  case q"Unit" => ...
}

但我认为Unit只是一个字符串文字,显然不匹配。如何通过q​​uasiqotes匹配类型?

我也试过

resultType match {
  case TypeRef(ThisType(_), Symbol("scala.Unit"), _) => ...
}

但有错误:

[error]  pattern type is incompatible with expected type;
[error]  found   : Symbol
[error]  required: Context.this.c.universe.SymbolContextApi

如何以这种方式匹配某个类型?

3 个答案:

答案 0 :(得分:6)

Quasiquotes在这种情况下不起作用的主要原因是你不能在Tree而不是Type上匹配。这两个是反射API的单独概念,它们并不完全相同。

检查类型是否与您期望的类型相同的一种简单方法是使用typeOf并键入相等运算符=:=

case tpe if tpe =:= typeOf[Unit] =>

当然这不是唯一的方法。也可以通过TypeRef进行匹配,并检查其中的符号是否相等,如其他答案所示。

答案 1 :(得分:3)

你答案的一个变体,如果有更好的话就值得商榷:

case TypeRef(_, sym, _) if sum == typeOf[Unit].typeSymbol => ...

答案 2 :(得分:-1)

唉,我发现没有比这更聪明了:

case TypeRef(_, sym, _) if sym.fullName == "scala.Unit" => ...