2017-02-10 60 views
3

我正在寫一個Scala宏,並遍歷樹來尋找類中的非私有字段。爲什麼這個公共字段有一個PRIVATE標誌?

考慮以下代碼,宏觀着眼於:

class Foo { 
    val bar: String = "test" 
} 

我穿越這個代碼和獲得barValDef。它的修飾符中只有兩個標誌:Flag.PRIVATEFlag.LOCAL

bar上使用private修飾符不會改變任何內容。使用protected修飾符僅將Flag.PROTECTED添加到標誌列表。

我錯過了什麼?我如何區分私人和公共領域?

編輯:

下面的代碼:

val bar: String = "test" 

既沒有Flag.PRIVATE也不Flag.LOCAL,這是有道理的,因爲它是一個 '全球性' 公共VAL。

我在裏面工作的上下文爲wartremover寫了一個新的疣,當擴展宏並遍歷代碼塊時,它只需從上下文的Universe中獲取Traverser

+3

你能分享你的代碼,以便我們可以玩嗎? – Dici

+0

如果你願意,我可以創建一個repro,但是我使用的代碼只是從Universe中取出一個Traverser並在宏擴展期間在代碼上運行它。 –

+0

@Dici我爲這個問題添加了更多信息和上下文。 HTH –

回答

2

A在斯卡拉的val定義擴展到private[this]字段與一個額外的getter。除了ValDef之外,你會發現應該有一個額外的DefDef方法定義,它具有相同的名稱,它是該字段上的getter。

+1

就是這樣!謝謝 :) –

相關問題