嵌套列表的编译时反射:typecheck List [List [Int]]返回List [List [...]]?

时间:2015-08-14 19:44:43

标签: scala scala-macros typechecking

我使用宏注释来检查类的字段,并根据这些字段添加成员。

e.g。

@AddVal
class A(x: Int)

扩展为

class A(x: Int){
  val get: Int = x
}

在提取ValDef后,它的tpe字段仍为null,因此要获得该类型,我有两个选择:

1)如果我在类型树上调用.toString,我可以看到类型,但现在我已经失去了一些类型安全性

2)如果我在类型树上使用c.typecheck,我可以获得类型,但前提是它的深度为1级。 List [List [Int]]以List [List [...]]

返回
        val fieldType = c.typecheck(q"type T = ${f.tpt}") match {
          case x @ TypeDef(mods, name, tparams, rhs)  => rhs.tpe
        }

那么,有没有办法以递归方式检查多型?

我再次尝试了类型检查rhs,但我得到了The argument types of an anonymous function must be fully known而且我不确定如何解决这个问题。

谢谢你看看,

儒略

1 个答案:

答案 0 :(得分:0)

我错误地将此错误归因于宏,而实际上有另一个基础宏(类型提供程序宏)未能提供正确的嵌套类型(在本例中为{{1 }})。