/ / स्केलेमेटा के साथ लिफ्टिंग स्ट्रिंग - स्कैला, स्कैला-क्वासिकोट्स, स्कैला-मेटा, क्वासिकोट्स

Scalameta के साथ लिफ्टिंग स्ट्रिंग - स्कैला, स्कैला-क्वासिकोट्स, स्कैला-मेटा, क्वासिकोट्स

मैं सीएसवी स्ट्रिंग में कक्षा को पार्स करने के लिए "toCSV" विधि को इंजेक्शन देना चाहता हूं। मेरा काम दो पैरामीटर लेता है:

  • सेक [स्ट्रिंग]: हेडर
  • सेक [सेक [कोई]]: फ़ील्ड

मेरा मैक्रो:

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.")
}
}
}

परिवर्तनीय अवधि एक सेक [स्ट्रिंग] है और quasiquotes वाक्यविन्यास केवल एक शब्द स्वीकार करते हैं। इसलिए, नीचे दी गई त्रुटि:

[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

क्या आपके पास एक समाधान है ?

अग्रिम धन्यवाद,

उत्तर:

उत्तर № 1 के लिए 1

यह शायद थोड़ा हैकी है लेकिन ऐसा लगता है: स्पष्ट रूप से अपना नक्शा बनाएं 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.")
}
}
}