使用从reify返回的准引号和树的AST取消引号



我试图使用Toolbox和quai-quote一起执行代码生成任务,在使用reify(x).tree返回的对象的AST时遇到StackOverflowError,我的代码如下:

abstract class A[T] {def i: T}
class B(val i: Int) extends A[Int]
object A {
    import scala.reflect.runtime.universe._
    import scala.reflect.runtime.{universe => ru}
    import scala.tools.reflect.ToolBox
    val javaSeparator = "$"
    val curId = new java.util.concurrent.atomic.AtomicInteger()
    protected def freshName(prefix: String): TermName = {
        newTermName(s"$prefix$javaSeparator${curId.getAndIncrement}")
 }
 def main(args: Array[String]) {
    val b = new B(2)
    calculate(b)
 }
 def calculate(a: A[_]): Unit = {
    val toolBox = runtimeMirror(getClass.getClassLoader).mkToolBox()
    val i = freshName("i")
    val aTree = reify(a).tree
    val tree = q"""
       val $i = $aTree.i
      println($i)
   """
   toolBox.eval(tree)
  }
}

当我删除A类的类型参数或使用def calculate(a: B)时,toolBox.eval成功并按预期工作,即在控制台中打印2。

我不太明白为什么会发生这种情况,有人能解释一下为什么带有类型参数的类定义无法通过评估吗?

这是https://issues.scala-lang.org/browse/SI-8833.在修复错误之前,您可以使用JIRA中注释中列出的解决方法。我只为2.11.x提供了一个变通方法,如果您需要2.10.x的变通方法,请留下评论。

相关内容

  • 没有找到相关文章

最新更新