如何找到从ToolBox.parse返回的树的类型(子树)?
例如,给定一个源文件Test。Scala包含以下内容:
val a = 7 // exp1
val b = 12.0 // exp2
var c = "hello" // exp3
val d = someFn( 9 ) // exp4
我希望能够从"树"中查询exp1-4的类型:
val sourceCode = io.Source.fromFile( "Test.scala" ).mkString
val tree = toolBox.parse( sourceCode )
我理解如何使用遍历器访问树节点:问题是如何找到以这种方式获得的树的类型。
看起来您需要在从toolbox.parse
返回的树上调用toolbox.typeCheck
parse
返回的树不包含类型信息,之后需要使用typecheck
:
object ToolBoxTest extends App {
import scala.reflect.runtime.universe.runtimeMirror
import scala.tools.reflect.ToolBox
val tb = runtimeMirror(getClass().getClassLoader()).mkToolBox()
import tb._, u._
val tree = typecheck(parse("""
val a = 7 // exp1
val b = 12.0 // exp2
var c = "hello" // exp3
"""))
new Traverser() {
override def traverse(t: Tree) = {
t match {
case v: ValDef =>
println(v.tpt)
case t =>
super.traverse(t)
}
}
}.traverse(tree)
}
这个打印Int
Double
String