Отмена цитирования 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, оставьте комментарий.