创建java bean类时出现scala宏未知类型错误

创建java bean类时出现scala宏未知类型错误,scala,macros,scala-quasiquotes,Scala,Macros,Scala Quasiquotes,我创建了以下代码片段,用作scala类型到java类型的编码生成器 object Macros { def encode[A <: Product, B](value:A):B = macro MacrosImpl.encode_impl[A, B] } class MacrosImpl(val c:Context) { import c.universe._ def encode_impl[ScalaType: c.WeakTypeTag, JavaType: c.Weak

我创建了以下代码片段,用作scala类型到java类型的编码生成器

object Macros {
  def encode[A <: Product, B](value:A):B = macro MacrosImpl.encode_impl[A, B]
}

class MacrosImpl(val c:Context) {
  import c.universe._
  def encode_impl[ScalaType: c.WeakTypeTag, JavaType: c.WeakTypeTag](value:c.Expr[ScalaType]) = {

    val scalaType: WeakTypeTag[ScalaType] = implicitly[WeakTypeTag[ScalaType]]

    val fields = scalaType.tpe.typeSymbol.companion.typeSignature.members.collectFirst {
      case method if method.name.toString == "apply" => method
    }.toList.flatMap(_.asMethod.paramLists.flatten).
      map{
      case s if s.name.toString == "id" => q"underlying.setId($value.$s.orNull)"
      case s => q"underlying.${c.universe.newTermName("set" + s.name.toString.capitalize) }($value.$s)"
    }

    val javaType: WeakTypeTag[JavaType] = implicitly[WeakTypeTag[JavaType]]

    q"""
       val underlying = new ${javaType.tpe}()
       ..$fields
       underlying
       """
  }
}
对象宏{
def encode[一种方法]
}.toList.flatMap(u.asMethod.paramLists.flatte)。
地图{
如果s.name.toString==“id”=>q”基础.setId($value.$s.orNull)为案例s
大小写s=>q“基础.${c.universe.newTermName(“set”+s.name.toString.capitalize)}($value.$s)”
}
val javaType:WeakTypeTag[javaType]=隐式地[WeakTypeTag[javaType]]
q”“”
val underground=new${javaType.tpe}()
..$fields
潜在的
"""
}
}
当我尝试使用它时,它在宏项目编译时编译得很好。它在使用库项目编译时引发异常

private val x: IpDataEntry = IpDataEntry(None, "a", "a")
println(Macros.encode[IpDataEntry, Underlying](x)) //not comp


[error] Unknown type: <error>, <error> [class scala.reflect.internal.Types$ErrorType$, class scala.reflect.internal.Types$ErrorType$] TypeRef? false
[trace] Stack trace suppressed: run 'last web/compile:compile' for the full output.
[error] (web/compile:compile) scala.reflect.internal.FatalError: Unknown type: <error>, <error> [class scala.reflect.internal.Types$ErrorType$, class scala.reflect.internal.Types$ErrorType$] TypeRef? false
[error] Total time: 12 s, completed Jun 19, 2014 11:53:42 AM
private val x:IpDataEntry=IpDataEntry(无、“a”、“a”)
println(Macros.encode[IpDataEntry,底层](x))//非comp
[error]未知类型:,[class scala.reflect.internal.Types$ErrorType$,class scala.reflect.internal.Types$ErrorType$]TypeRef?false
[trace]堆栈跟踪被抑制:对完整输出运行“last web/compile:compile”。
[错误](web/compile:compile)scala.reflect.internal.FatalError:未知类型:,[class scala.reflect.internal.Types$ErrorType$,class scala.reflect.internal.Types$ErrorType$]TypeRef?错误
[错误]总时间:12秒,已完成2014年6月19日上午11:53:42
我被困在这里,在我的代码中找不到任何错误


Scala版本是2.11.1。

我自己在代码块中找到了解决方案

q"underlying.setId($value.$s.orNull)"
$s
不是术语名。因此我将其修改为

q"underlying.setId($value.${c.universe.newTermName(s.name.toString)}.orNull)"

无论如何,如果该错误指向语法树中的正确问题,它确实很有用。我花了大约2天时间来找出问题。

你能将整个项目发布到公共场所吗,例如github?你救了我一命,非常感谢:)