使用Scala反射,您可以获取AST中某些元素的值。例如,当我想在AST中获取某些String的值时,可以使用以下语句,该语句工作得很好:
a.tree.children.tail.collect({case Literal(Constant(id: String)) => id}).head
但是,当我要访问的值是scala.Symbol而不是String时,上面的语句不会返回该值:
a.tree.children.tail.collect({case Literal(Constant(id: Symbol)) => id}).head
我的问题:scala.Symbol似乎不是AST中的文字常量吗?
答案 0 :(得分:3)
您可以打印树木
import scala.reflect.runtime.universe._
println(showRaw(reify {
"aaa"
}.tree)) // Literal(Constant("aaa"))
println(showRaw(reify {
'aaa
}.tree))
// Apply(Select(Ident(scala.Symbol), TermName("apply")), List(Literal(Constant("aaa"))))
尝试
case q"Symbol.apply(${Literal(Constant(id: String))})" => id
或
case Apply(Select(Ident(TermName("Symbol")), TermName("apply")), List(Literal(Constant(id: String)))) => id
您可以查看它们如何与Shapeless中的Symbol
s一起使用