在宏定义的scala quasiquote中输入不匹配:"类型不匹配; found:field.NameType required:c.universe.TermName"

时间:2014-05-30 02:38:15

标签: scala macros scala-quasiquotes

我问了更长的question,但似乎有太多的代码供人们排序,所以我创建了这个问题,专注于一个较小的,特定的问题我'面对在Scala中使用宏的问题。

请考虑以下代码段:

val tpe = weakTypeOf[T]
val companion = tpe.typeSymbol.companionSymbol

val fields = tpe.declarations.collectFirst {
  case m: MethodSymbol if m.isPrimaryConstructor => m
}.get.paramss.head

val toMapParams = fields.map { field =>
  val name = field.name
  val decoded = name.decoded
  q"$decoded -> t.$name"
}

请注意,fields只是此代码中案例类的主要构造函数的参数列表。我困惑的地方是quasiquote q"$decoded -> t.$name"的结果。这究竟是什么意思?它应该是什么类型的?我收到编译错误,说明以下内容:

Multiple markers at this line
    - Implicit conversions found: q"$decoded -> t.$name" => Quasiquote(q"$decoded -> t.
     $name")
    - type mismatch; found : field.NameType required: c.universe.TermName
    - type mismatch; found : field.NameType required: c.universe.TermName

任何人都可以解释这个错误吗?感谢。

1 个答案:

答案 0 :(得分:2)

字段类型为List[Symbol],这意味着这些字段的名称类型尚无定论(未知是TermName还是TypeName)。这意味着您无法在quasiquote中的任何位置插入此类名称。

一个简单的解决方法是val name = field.name.toTermName,明确地告诉编译器它正在查看术语名称,以便quasiquote知道如何处理它。