簡體   English   中英

Scala宏注釋-當我將其用作類型參數時,為什么類似乎沒有更新?

[英]Scala Macro Annotations - Why doesn't my class appear to be updated when I use it as a type parameter?

我用尤金Burmako宏觀注釋例如,從宏觀天堂 (感謝尤金!),並在這里修改了它的添加val到一個空的類在這里

作為一個實例,我可以按預期的那樣調用新的val 但是,當我嘗試將更新的類用作類型參數時,例如在Salat (解析為Scala sig)或Scalavro (使用2.10反射)中,則該類仍然顯示為空(即,好像從未添加過val )。

由於Salat解析了Scala簽名,因此我進行了檢查,它比正常簽名短約30個條目,並且條目的順序有所不同。 但是似乎簽名確實包含有關添加的val

那么,為什么無法訪問新的val信息,有什么辦法可以做到呢? 謝謝參觀。

僅將val添加到模板中並不會自動使其成為構造函數參數。 為此,構造函數本身也需要進行調整。 幸運的是,我們有准引用,與手動樹構建相比,它大大簡化了此任務。

case q"$mods class $name[..$tparams](..$first)(...$rest) extends ..$parents { $self => ..$body }" :: Nil =>
  val CASEACCESSOR = (1 << 24).toLong.asInstanceOf[FlagSet]
  val PARAMACCESSOR = (1 << 29).toLong.asInstanceOf[FlagSet]
  val helloMods = Modifiers(CASEACCESSOR | PARAMACCESSOR | DEFAULTPARAM)
  val helloVal = q"""$helloMods val x: String = "hello macro!""""
  q"$mods class $name[..$tparams](..$first, $helloVal)(...$rest) extends ..$parents { $self => ..$body }"

請注意幾個怪癖:1)我們需要設置官方API中不存在的CASEACCESSOR和PARAMACCESSOR標志,以避免Salat崩潰; 2)我們需要設置DEFAULTPARAM,以確保scalac能夠識別默認值參數為默認值,3)無法推斷默認參數的類型,因此我們需要在此處顯式提供String。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM