Ошибки компиляции при определении макроса для преобразования экземпляра класса дела в карту и обратно

Я пытаюсь понять следующее сообщение в блоге, в котором обсуждается, как использовать макросы для создания общего подхода на основе макросов для преобразования объектов класса случая в карту и из нее: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
      }
    """
    }
  }
}

Ответы на вопрос(0)

Ваш ответ на вопрос