Макрос Scala для присвоенной метки значения в методе применения

Из объекта Naming ниже (адаптировано из ответа в макрос Scala получает закрывающую строку), который собирает метку, связанную со значением,

val x = Naming.apply("")
x: String = x

хотел бы изменить метод apply, чтобы он доставлял новый экземпляр Naming, где assignedName принимает назначенную метку значения, а именно:

val x = Naming()
assert( x.assignedName == "x")

В следующем коде такое наивное изменение

def apply(s: String): String = Naming( macro impl )

не может работать. Любой рабочий подход к созданию экземпляра assignedName очень ценен.

case class Naming(var assignedName: String = "") {
  val m = collection.mutable.Map[String,Int]()
}

object Naming {

  import scala.language.experimental.macros
  import scala.reflect.macros.Context

  def apply(s: String): String = macro impl 

  def impl(c: Context)(s: c.Expr[String]): c.Expr[String] = {
    import c.universe._

    c.enclosingClass.collect {
      case ValDef(_, name, _, rhs) if rhs.pos == c.macroApplication.pos =>
        c.literal(name.decoded)
    }.headOption.getOrElse(
      c.literal("")
    )
  }

}

Обновить В методе apply решением может быть reify обновление экземпляра Naming с assisgnedName. Если это возможно, как это можно реализовать?


person elm    schedule 20.11.2014    source источник