Scala工具箱中的自定义类和对象的类型检查

时间:2019-03-15 00:10:10

标签: scala

我正在尝试使用Scala中的Toolbox键入检查任意AST。基本上,我使用类似

的准引号构建表达式
newTree = q"$oldTree + $x"
newTree = Typecheck(newTree)

其中$oldTree是一种AST,具有我不知道的某种类型。我需要根据newTree.tpeoldTree中已经存在的信息填写x之类的字段。

Typecheck()的定义如下:

import scala.reflect.runtime.universe._
import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox

import bitstream.types._

object Typecheck {

  def apply[A](treeStr: String): A = {
    val toolbox = runtimeMirror(getClass.getClassLoader).mkToolBox()
    val tree = toolbox.parse(treeStr)
    toolbox.typecheck(tree).asInstanceOf[A]
  }

}

当前,我正在尝试处理以下内容:

Typecheck("types.this.Bit.bit2Int(d2_old)")

其中Bit.bit2Int()是在包Bit中的对象bitstream.types中定义的方法。这是一个包含自定义类和对象的软件包。我目前收到错误消息:

scala.tools.reflect.ToolBoxError: reflective typecheck has failed: types is not an enclosing class

我的猜测是bitstream.types不在工具箱使用的镜像中,但我不知道如何解决。我认为this Github issue是相关的,但是我不确定如何解释问题页面上的讨论。

2 个答案:

答案 0 :(得分:1)

尝试

Typecheck("_root_.bitstream.types.Bit.bit2Int(d2_old)")

即有包且无this。 (我不知道d2_old是什么,如果可以的话也不知道。)

答案 1 :(得分:0)

也许您可以将import添加到树中

val tree = toolbox.parse("""
  import bitstream.types._
  ${treeStr}
""")