键入宏定义的斯卡拉quasiquote不匹配:“类型不匹配; 发现:field.NameType

2019-10-20 05:26发布

我问一个较长的问题 ,但现在看来,这是太多的代码,所以我已经创建了这个问题,把重点放在我面对关于使用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

任何人能解释这个错误? 谢谢。

Answer 1:

类型字段是List[Symbol] ,这意味着这些字段的名称的类型是不确定的(未知它是否是一个TermNameTypeName )。 这意味着你不能插入这样的名字在quasiquote基本上任何地方。

一个简单的修正是做val name = field.name.toTermName ,明确告诉它在看一个术语名称,编译器,使quasiquote知道如何处理它。



文章来源: Type mismatch in scala quasiquote of macro definition: “type mismatch; found : field.NameType required: c.universe.TermName”