我正在尝试使用宏和静态注释生成案例类。
有没有办法将c.universe.Tree转换成另一种c.universe类型,特别是c.universe.Name
发布于 2015-07-03 21:52:39
答案取决于您拥有什么样的树,但无论如何,您都希望从树到字符串,然后可以使用TypeName和TermName构造函数创建TypeName或TermName。
例如,这里我们的树是一个字符串文本:
import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context
def callFooImpl(c: Context)(name: c.Expr[String]): c.Expr[Unit] = {
import c.universe._
val termName: TermName = name.tree match {
case Literal(Constant(s: String)) => TermName(s)
case _ => c.abort(c.enclosingPosition, "Not a string literal")
}
c.Expr[Unit](q"$termName.foo()")
}
def callFoo(name: String): Unit = macro callFooImpl
case class Foo(i: Int) {
def foo(): Unit = println(s"Called foo() on $this")
}然后:
scala> :paste
// Entering paste mode (ctrl-D to finish)
val myFoo = Foo(10)
callFoo("myFoo")
// Exiting paste mode, now interpreting.
Called foo() on Foo(10)
myFoo: Foo = Foo(10)在这里,我们用Literal和Constant解构了字符串文本树,以获得一个编译时字符串,然后我们使用它来创建一个TermName,我们可以在生成的代码中使用它。
https://stackoverflow.com/questions/31212686
复制相似问题