2014-04-10 75 views
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

回答

0

我會進行類型檢查一個虛擬的定義,例如c.typeCheck(q"class Dummy${newTypeName(c.fresh())}"),然後看看它的符號。行走該符號的Symbol.owner鏈將顯示封裝包。

+0

感謝您的建議,這將是偉大的,但編譯器抱怨:'[錯誤]錯誤發生在涉及默認參數的應用程序中。所以我加了'Modifiers()'就像這樣:'c.typeCheck(q「class Dummy $ {newTypeName(c.fresh()); Modifiers()}」)',但是導致typer錯誤:'[error ]最後一棵樹到TYPER:型虛擬 [錯誤]符號:(標誌:) [錯誤]符號定義: [錯誤]符號業主: [錯誤]上下文業主:' - 任何想法? –

+0

啊,這裏是在正確的軌道上:'val freshName = c.fresh(newTypeName(「Probe $」)) val probe = c.typeCheck(q「」「{class $ freshName;()}」「」) val owner = probe match {Block}(List(t),r)=> t.symbol.owner }'很有責任。 –

相關問題