0
鑑於(斯卡拉2.10.3),我可以通過Scala宏註釋的impl從ClassDef獲取包/擁有者嗎?
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
感謝您的建議,這將是偉大的,但編譯器抱怨:'[錯誤]錯誤發生在涉及默認參數的應用程序中。所以我加了'Modifiers()'就像這樣:'c.typeCheck(q「class Dummy $ {newTypeName(c.fresh()); Modifiers()}」)',但是導致typer錯誤:'[error ]最後一棵樹到TYPER:型虛擬 [錯誤]符號:(標誌:) [錯誤]符號定義: [錯誤]符號業主: [錯誤]上下文業主:' - 任何想法? –
啊,這裏是在正確的軌道上:'val freshName = c.fresh(newTypeName(「Probe $」)) val probe = c.typeCheck(q「」「{class $ freshName;()}」「」) val owner = probe match {Block}(List(t),r)=> t.symbol.owner }'很有責任。 –