我可以从Scala宏注释的impl中的ClassDef获取包/所有者吗?
鉴于Scala 2.10.3我可以从Scala宏注释的impl中的ClassDef获取包/所有者吗?,scala,scala-macros,Scala,Scala Macros,鉴于Scala 2.10.3 package models @MyAnnotation case class MyClass() 如何在宏的impl中获取包名 我试过: 1建议使用类似的类型检查,但这会导致堆栈溢出,尽管我可以看到它会吐出正确的全名 val result = { annottees.map(_.tree).toList match { case classDef @ q"$mods class $name[..$tparams](..$first)(...$re
package models
@MyAnnotation
case class MyClass()
如何在宏的impl中获取包名
我试过:
1建议使用类似的类型检查,但这会导致堆栈溢出,尽管我可以看到它会吐出正确的全名
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,希望包和目录结构对应
我把打字检查搞砸了吗?我应该接受3个还是4个?如何实现我的目标有什么建议吗
非常感谢您的意见
-朱利安我会打字检查一个伪定义,例如c.typeCheckqclass伪${newTypeNamec.fresh},然后检查它的符号。遍历该符号的Symbol.owner链将显示所包含的包。感谢您的建议,这将非常好,但编译器抱怨:在包含默认参数的应用程序中发生了:[error]错误。所以我添加了这样的修饰符:c.typeCheckqclass Dummy${newTypeNamec.fresh;Modifiers},但这导致了一个typer错误:[error]最后一个树到typer:type Dummy[error]symbol:flags:[error]符号定义:[error]符号所有者:[error]上下文所有者:-有什么想法吗?啊,这是正确的:val freshName=c.freshnewTypeNameProbe$val probe=c.typeCheckq{class$freshName;}val owner=probe match{case BlockListt,r=>t.symbol.owner}非常感谢。