Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以从Scala宏注释的impl中的ClassDef获取包/所有者吗?_Scala_Scala Macros - Fatal编程技术网

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

我可以从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

鉴于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)(...$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}非常感谢。