我使用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
我已經通過的背景下審視,看是否使用那裏有其他任何明顯的方法,但沒有跳出。
任何幫助表示讚賞!
所以在我的例子中,對象Foo在另一個對象內部,讓我們說叫外部對象。當我嘗試c.typeCheck(塊(annottees.head.tree.duplicate))時,我得到一個非法的循環引用錯誤。它拉動包含的對象,因此再次拉動自己。 – user3293336
有沒有使用當前的上下文來解決巴茲some.Baz的方式?根據返回的錯誤判斷,它必須在內部進行。 – user3293336
你可以在github上發佈你的代碼示例嗎?我會盡力幫忙。 –