我正在尝试使用Scala中的Toolbox键入检查任意AST。基本上,我使用类似
的准引号构建表达式newTree = q"$oldTree + $x"
newTree = Typecheck(newTree)
其中$oldTree
是一种AST,具有我不知道的某种类型。我需要根据newTree.tpe
和oldTree
中已经存在的信息填写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是相关的,但是我不确定如何解释问题页面上的讨论。
答案 0 :(得分:1)
尝试
Typecheck("_root_.bitstream.types.Bit.bit2Int(d2_old)")
即有包且无this
。
(我不知道d2_old
是什么,如果可以的话也不知道。)
答案 1 :(得分:0)
也许您可以将import
添加到树中
val tree = toolbox.parse("""
import bitstream.types._
${treeStr}
""")