2016-09-13 82 views
0

給定一個帶註釋的特徵,我應該如何去創建一個實現特徵的抽象類?如何以編程方式生成擴展註釋特徵的抽象Scala類?

因此,考慮以下用戶特質......

@Neuron 
trait SomeTrait { 
    // ... 
} 

...在我的圖書館我想插入類似以下內容旁邊:

abstract class SomeTraitImpl extends SomeTrait 

注意,我知道除了用@Neuron註釋外,沒有關於給定特徵的信息。

我試着用ASM來實現這個,實現了在問題Using Scala traits with implemented methods in Java的答案中解釋的概念,但是這個概念只是抓住了Scala編譯器發出的字面代碼的表面。即使我成功掌握了var,val,lazy val,抽象重寫等所有可能的組合,它的可能性也很高,它將與下一個Scala編譯器的版本打破。

因此,它看起來應該寫一個編譯時宏代替。然而,我正在摸索Scala宏的文檔,所以我想知道是否有人可以起草一些讓我開始的東西?任何暗示,表示讚賞,請!

+0

您是否想修改沒有'@ Neuron'註解的代碼?所以'@Neuron特性SomeTrait'將保持不變,但是'SomeTraitImpl extends SomeTrait'的抽象類將在某處創建,對嗎? – dveim

+0

是的,原始特徵應該保持原樣,只是應該在它旁邊插入新的「SomeTraitImpl」。 –

+0

假設使用'@Neuron trait SomeTrait'的項目與'SomeTraitImpl'的項目分開編譯(記住宏在編譯時工作)。如何生成'SomeTraitImpl'的代碼?可能的解決方法 - 在第二個項目中使用另一個宏'NeuronGenerator',它會盡最大努力找到'@ Neuron'並生成AST。你的情況可能嗎? – dveim

回答

0

執行此操作的正確方法是使@Neuronmacro annotation(使用Macro Paradise編譯器插件)並實現宏以執行代碼轉換。結果代碼現在是Neuron DI的一部分,這是我寫的依賴注入框架。

相關問題