首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala宏: c.universe.Tree到c.universe.Name

Scala宏: c.universe.Tree到c.universe.Name
EN

Stack Overflow用户
提问于 2015-07-03 18:46:54
回答 1查看 813关注 0票数 2

我正在尝试使用宏和静态注释生成案例类。

有没有办法将c.universe.Tree转换成另一种c.universe类型,特别是c.universe.Name

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-03 21:52:39

答案取决于您拥有什么样的树,但无论如何,您都希望从树到字符串,然后可以使用TypeNameTermName构造函数创建TypeNameTermName

例如,这里我们的树是一个字符串文本:

代码语言:javascript
复制
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")
}

然后:

代码语言:javascript
复制
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)

在这里,我们用LiteralConstant解构了字符串文本树,以获得一个编译时字符串,然后我们使用它来创建一个TermName,我们可以在生成的代码中使用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31212686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档