2014-02-10 58 views
1

我使用Macro Paradise在Scala 2.10.3上。我在那裏我想一個特徵添加到對象宏註釋,如:使用scala宏註釋將額外特徵添加到對象

@MyAnnotation 
object Foo extends Bar {} 

擴張後,我想是這樣的:

object Foo extends Bar with Baz {} 

Baz是在編譯的性狀訪問範圍。使用微距天堂,我可以清晰地解構我的目標樹:

q"object $obj extends ..$bases { ..$body }" = tree 

其中基地擁有訂貨號(newTypeName(「酒吧」))的形式列出

我只需要添加一個額外的Baz進入現有的擴展基地和重建樹,問題是目標可能「已經」包含Baz。在這種情況下,我不想添加它。給我的名字縮短了。有沒有方法將它們轉換爲宏內的實際類型引用?

我試圖在宏觀以下幾點:c.typeCheck(Ident(newTypeName("Baz"))),但我得到了以下錯誤:

scala.reflect.macros.TypeCheckException: trait some.Baz is not a value 

我已經通過的背景下審視,看是否使用那裏有其他任何明顯的方法,但沒有跳出。

任何幫助表示讚賞!

回答

1

在Scala 2.10中,c.typeCheck總是把它的參數作爲一個術語來處理,並且你需要花費更多的時間去檢查表示類型的樹。

此答案解釋了一種解決方法,以類型化類型並概述特定於宏註釋的限制:Can't access Parent's Members while dealing with Macro Annotations

+0

所以在我的例子中,對象Foo在另一個對象內部,讓我們說叫外部對象。當我嘗試c.typeCheck(塊(annottees.head.tree.duplicate))時,我得到一個非法的循環引用錯誤。它拉動包含的對象,因此再次拉動自己。 – user3293336

+0

有沒有使用當前的上下文來解決巴茲some.Baz的方式?根據返回的錯誤判斷,它必須在內部進行。 – user3293336

+0

你可以在github上發佈你的代碼示例嗎?我會盡力幫忙。 –