宏定义的scala准注释中的类型不匹配:“0”;类型失配;找到:field.NameType必需:c.universe.TermName“;

宏定义的scala准注释中的类型不匹配:“0”;类型失配;找到:field.NameType必需:c.universe.TermName“;,scala,macros,scala-quasiquotes,Scala,Macros,Scala Quasiquotes,我问了一个较长的问题,但似乎太多的代码让人们无法分类,所以我创建了这个问题,以关注我在Scala中使用宏时面临的一个较小的、特定的问题 考虑以下代码段: val tpe = weakTypeOf[T] val companion = tpe.typeSymbol.companionSymbol val fields = tpe.declarations.collectFirst { case m: MethodSymbol if m.isPrimaryConstructor => m

我问了一个较长的问题,但似乎太多的代码让人们无法分类,所以我创建了这个问题,以关注我在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
只是此代码中case类的主构造函数的参数列表。我感到困惑的是准iqueote
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

有人能解释这个错误吗?谢谢。

字段的类型是
列表[Symbol]
,这意味着这些字段的名称类型是不确定的(未知是
术语名还是
类型名
)。这意味着您不能在Quasikote中的任何位置插入这样的名称

一个简单的修复方法是执行
val name=field.name.toTermName
,显式地告诉编译器它正在查看一个术语名,以便quasikote知道如何处理它