如何找到从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 )
我理解如何使用Traverser访问树节点:问题涉及如何找到以这种方式获得的树的类型。
答案 0 :(得分:1)
您似乎需要在toolbox.typeCheck
返回的树上调用toolbox.parse
。
答案 1 :(得分:1)
从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