我在Scala2.12宏环境下工作。
所有的构造函数字段都是动态发现的,没有可能在quasiquote中对它们进行硬编码。
期望的结果(精简到最小的可证明示例)是这样的代码:
case class A2(i: Int) extends A(B(i))
其中b是在超级构造函数的调用中内联构造的。
我有这个:
q"case class ${className.toTypeName}(..$fields) extends $superTypeType(..$superConstructorArgs)")
我希望通过以下方式从$fields建立$superconstructorargs:
case q"case class $className(..$fields) extends ..$bases { ..$body }" => {
val superConstructorArgs = B(fields.map{case v:ValDef => ???
编译器希望在超类型构造函数中插入树而不是b。
什么样的树适合绕着我的b走?它应该怎么建?
1条答案
按热度按时间siv3szwd1#
我带着些许尴尬向后人汇报:
缺少的代码是
这是在quasiquotation中调用时需要折叠回超级构造函数的元素。