2017-02-10 4 views
3

私はScalaマクロを作成しており、クラス内の非プライベートフィールドを見つけるためにツリーをトラバースしています。私はこのコードを横断してbarValDefに取得していますこのパブリックフィールドにPRIVATEフラグが設定されているのはなぜですか?

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

はでマクロが見えるこのコードを考えてみましょう。修飾子には、 Flag.PRIVATEFlag.LOCALという2つのフラグしかありません。

private修飾子を使用すると、barは変更されません。 protected修飾子を使用すると、フラグリストにFlag.PROTECTEDが追加されます。

私には何が欠けていますか?民間と公共のフィールドを区別するにはどうすればよいですか?

編集:

次のコード:

val bar: String = "test" 

それは 'グローバル' のパブリックヴァルだから理にかなっている、Flag.PRIVATEFlag.LOCALもありません。

私が働いている文脈は、wartremoverの新しい疣贅を書いています。これは、マクロを拡張してコードブロックを横断するときに文脈の世界からを単に受け取ります。

+3

あなたのコードを共有して、そのコードで遊ぶことができますか? – Dici

+0

私は好きな人でreproを作成することができますが、私が使用するコードは、単純にTraverserをユニバースから取り出し、マクロ展開時にコード上で実行するというものです。 –

+0

@Dici質問に情報と文脈を追加しました。 HTH –

答えて

2

valスカラの定義は、追加のゲッターでprivate[this]フィールドに展開されます。 ValDef以外にも、フィールド上のゲッターである同じ名前の追加のDefDefメソッド定義があるはずです。

+1

それはまさにそれです!ありがとうございました :) –

関連する問題