Ошибки компиляции при определении макроса для преобразования экземпляра класса дела в карту и обратно
Я пытаюсь понять следующее сообщение в блоге, в котором обсуждается, как использовать макросы для создания общего подхода на основе макросов для преобразования объектов класса случая в карту и из нее:http://blog.echo.sh/post/65955606729/exploring-scala-macros-map-to-case-class-conversion
Несмотря на то, что я прочитал весь пост и другую статью о макросах scala, я все еще не до конца понимаю, как они работают. К сожалению, я получаю несколько ошибок компиляции из примера кода, приведенного в сообщении в блоге, и не уверен, почему ошибки возникают, и как их устранить. Я для полноты воспроизводю приведенный ниже код, которому предшествуют ошибки компиляции (я комментировал фрагмент кода с комментариями относительно ошибок компиляции). Кто-нибудь знает, почему возникают проблемы с компилятором и как их решить?
-type mismatch; found : field.NameType required:
c.universe.TermName
-Can't unquote List[Nothing] with .., bottom type values often indicate programmer mistake
Вот код:
import scala.reflect.macros.Context
import scala.language.experimental.macros
trait Mappable[T] {
def toMap(t: T): Map[String, Any]
def fromMap(map: Map[String, Any]): T
}
object Mappable {
implicit def materializeMappable[T]: Mappable[T] = macro materializeMappableImpl[T]
def materializeMappableImpl[T: c.WeakTypeTag](c: Context): c.Expr[Mappable[T]] = {
import c.universe._
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, fromMapParams) = fields.map { field ⇒
val name = field.name
val decoded = name.decoded
val returnType = tpe.declaration(name).typeSignature
(q"$decoded → t.$name", q"map($decoded).asInstanceOf[$returnType]") // error 1
}.unzip
c.Expr[Mappable[T]] {
q"""
new Mappable[$tpe] {
def toMap(t: $tpe): Map[String, Any] = Map(..$toMapParams)
def fromMap(map: Map[String, Any]): $tpe = $companion(..$fromMapParams) // error 2
}
"""
}
}
}