1

I'm trying to generate statement by case class parameters.

case class f(a:String, b:String){
  val statement = Macroses.st[f]
}

object MacrosTest {
  def start() {
    val result =  f("1", "2").statement
  }
}

Result must be INSERT INTO tableName(a, b) VALUES ('1', '2');

This is my macros

 def st[T]:Insert = macro st_impl[T]

 def st_impl[A : c.WeakTypeTag](c: Context): c.Expr[Insert] = {
   import c.universe._
   val methods: List[String] = c.weakTypeOf[A].typeSymbol.
   typeSignature.decls.toList.filterNot(_.isMethod)
   .map(_.name.toString)
   c.Expr[Insert](q"""QueryBuilder.insertInto("tableName")${methods.map(v => s""".value("$v", $v)""").mkString}""")
 }

I got exception:

 c.universe.Name expected but c.universe.Tree found

If i use this quasiquote it works good.

(q"""QueryBuilder.insertInto("tableName").value("a", a).value("b", b)""")
Ivan
  • 462
  • 3
  • 13
  • In quasiquotes, $ doesn't mean interpolating a string like what s"" does. It has to be a tree. Let me think a bit. – Tanin Sep 29 '15 at 04:12
  • I did so: `q""" import com.datastax.driver.core.querybuilder.QueryBuilder ${methods.map(v =>(v.toColumnCase, TermName(v)))} .foldLeft(QueryBuilder.insertInto(${reify(tableName.splice)}))((newInsert, next) => newInsert.value(next._1, next._2) )"""` but foldLeft works in runtime and it's doesn't i want. – Ivan Sep 29 '15 at 10:54

0 Answers0