Отмена цитирования AST с использованием квазицитат и дерева, возвращенного из reify

Я пытался использовать Toolbox и квазицитатуру вместе для выполнения задач генерации кода, и столкнулся с StackruError при использовании AST объекта, возвращенного из reify(x).treeмой код выглядит следующим образом:

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 в консоли.

Я не совсем понимаю, почему это происходит, может кто-нибудь объяснить, почему определение класса с параметрами типа не дает оценки?

1 ответ

Решение

Это https://issues.scala-lang.org/browse/SI-8833. Пока ошибка не устранена, вы можете использовать обходной путь, изложенный в комментариях в JIRA. Я предоставил обходной путь только для 2.11.x, и если он вам нужен для 2.10.x, оставьте комментарий.

Другие вопросы по тегам