我可以在Scala宏注释的impl中从ClassDef获取包/所有者吗?

时间:2014-04-10 06:15:09

标签: scala scala-macros

鉴于(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

1 个答案:

答案 0 :(得分:0)

我会检查一个虚拟定义,例如c.typeCheck(q"class Dummy${newTypeName(c.fresh())}")然后查看其符号。走这个符号的Symbol.owner链会显示封闭的包。