我希望注入一个方法“toCSV”来将类解析到injecting中。我的函数有两个参数:
我的宏:
class model extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match {
case cls @ Defn.Class(_, _, _, Ctor.Primary(_, _, paramss), template) =>
def createToCSV(paramss: Seq[Seq[Term.Param]]): Defn.Def = {
val names = paramss.flatten.map(param => param.name.syntax)
val fields = paramss.map(_.map(param => Term.Name(param.name.value)))
q"""def toCSV =
CSVTools.toCSV(Seq(...$names), Seq(Seq(...$fields)))"""
}
val toCSVImpl = createToCSV(paramss)
val templateStats: Seq[Stat] = toCSVImpl +: template.stats.getOrElse(Nil)
cls.copy(templ = template.copy(stats = Some(templateStats)))
case _ =>
println(defn.structure)
abort("@model must annotate a class.")
}
}
}变量项是一个SeqString,而拟引号语法只接受一个项。因此,出现了以下错误:
[error] /home/xxxxx/intellij/workspace/heroes-scala-meta/macros/src/main/scala/examples/model.scala:18: type mismatch when unquoting;
[error] found : scala.collection.immutable.Seq[String]
[error] required: scala.collection.immutable.Seq[scala.collection.immutable.Seq[scala.meta.Term.Arg]]
[error] CSVTools.toCSV(Seq(...$names), Seq(Seq(...$fields)))"""
[error] ^
[error] one error found
[error] (macros/compile:compileIncremental) Compilation failed你有解决办法吗?
提前感谢,
发布于 2017-12-27 02:40:25
这可能有点麻烦,但似乎有效:将names显式映射为字符串文本。
class model extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match {
case cls@Defn.Class(_, _, _, Ctor.Primary(_, _, paramss), template) =>
def createToCSV(paramss: Seq[Seq[Term.Param]]): Defn.Def = {
val names: Seq[String] = paramss.flatten.map(param => param.name.syntax)
val fields = paramss.map(_.map(param => Term.Name(param.name.value)))
val nameLiterals: Seq[Lit.String] = names.map(n => q"$n".asInstanceOf[Lit.String])
q"""def toCSV =
CSVTools.toCSV(scala.collection.immutable.Seq(..$nameLiterals),
scala.collection.immutable.Seq(scala.collection.immutable.Seq(...$fields)))"""
}
val toCSVImpl = createToCSV(paramss)
val templateStats: Seq[Stat] = toCSVImpl +: template.stats.getOrElse(Nil)
cls.copy(templ = template.copy(stats = Some(templateStats)))
case _ =>
println(defn.structure)
abort("@model must annotate a class.")
}
}
}https://stackoverflow.com/questions/47980685
复制相似问题