如何获得给定 Ident 的树?
How do I get a Tree given an Ident?
假设我从中提取了 lhs
、tpe
、rhs
:
q"$mods val $lhs: $tpe = $rhs"
现在,tpe
是一个 Ident
。如何获取此ident对应的Tree
(或Type
)对象?
Ident是一棵代表名字的树,类型通过typechecking赋值
scala> import reflect.runtime._,universe._,tools.reflect._
import reflect.runtime._
import universe._
import tools.reflect._
scala> val t = q"val i: Int = 42"
t: reflect.runtime.universe.ValDef = val i: Int = 42
scala> val q"val $x: $what = $rhs" = t
x: reflect.runtime.universe.TermName = i
what: reflect.runtime.universe.Tree = Int
rhs: reflect.runtime.universe.Tree = 42
scala> showRaw(what)
res1: String = Ident(TypeName("Int"))
scala> val tb = currentMirror.mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@27d5a580
scala> val v = tb.typecheck(t)
v: tb.u.Tree = val i: Int = 42
scala> v.children.head.tpe
res2: tb.u.Type = Int
假设我从中提取了 lhs
、tpe
、rhs
:
q"$mods val $lhs: $tpe = $rhs"
现在,tpe
是一个 Ident
。如何获取此ident对应的Tree
(或Type
)对象?
Ident是一棵代表名字的树,类型通过typechecking赋值
scala> import reflect.runtime._,universe._,tools.reflect._
import reflect.runtime._
import universe._
import tools.reflect._
scala> val t = q"val i: Int = 42"
t: reflect.runtime.universe.ValDef = val i: Int = 42
scala> val q"val $x: $what = $rhs" = t
x: reflect.runtime.universe.TermName = i
what: reflect.runtime.universe.Tree = Int
rhs: reflect.runtime.universe.Tree = 42
scala> showRaw(what)
res1: String = Ident(TypeName("Int"))
scala> val tb = currentMirror.mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@27d5a580
scala> val v = tb.typecheck(t)
v: tb.u.Tree = val i: Int = 42
scala> v.children.head.tpe
res2: tb.u.Type = Int