鉴于(Scala 2.10.3),
package models
@MyAnnotation
case class MyClass()
如何在宏的impl中获取包名?
我试过了:
1)建议使用typeCheck
之类here,但这会导致堆栈溢出(尽管我可以看到它吐出正确的全名)。
val result = {
annottees.map(_.tree).toList match {
case classDef @ q"$mods class $name[..$tparams](..$first)(...$rest) extends ..$parents { $self => ..$body }" :: Nil => {
val full = c.typeCheck(q"??? : $name").tpe.typeSymbol.fullName
...
2)收集ClassDef
并致电.symbol
会发现它没有。
我想避免:
3)将值作为参数传递给注释。
4)在扩展课程时注释包并存储名称以供使用。
5)解析上下文.enclosingPosition
,希望包和目录结构对应。
我是否惹恼了typeCheck
?我应该选择#3还是#4?有什么建议如何实现我的目标?
非常感谢任何输入,
-Julian
答案 0 :(得分:0)
我会检查一个虚拟定义,例如c.typeCheck(q"class Dummy${newTypeName(c.fresh())}")
然后查看其符号。走这个符号的Symbol.owner
链会显示封闭的包。