嵌套列表的编译时反映:typecheck List[List[Int]] returns List[List[...]]?
Compile-time Reflection of Nested List: typecheck List[List[Int]] returns List[List[...]]?
我正在使用宏注释检查 class 的字段并根据这些字段添加成员。
例如
@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
,我不确定如何解决这个问题。
感谢观看,
朱利安
我错误地将此错误归因于宏,而实际上 另一个 底层宏(类型提供程序宏)未能提供正确的嵌套类型(在此案例 Int
).
我正在使用宏注释检查 class 的字段并根据这些字段添加成员。
例如
@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
,我不确定如何解决这个问题。
感谢观看,
朱利安
我错误地将此错误归因于宏,而实际上 另一个 底层宏(类型提供程序宏)未能提供正确的嵌套类型(在此案例 Int
).