在ToolBox.parse之后获取类型信息?

时间:2014-08-04 09:13:07

标签: scala reflection abstract-syntax-tree

如何找到从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访问树节点:问题涉及如何找到以这种方式获得的树的类型

2 个答案:

答案 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