2013-06-21 8 views
10

my previous questionへの回答により、各フィールド名をクラスの値にマップするMapを返すような関数マクロを作成することができました。 スカラマクロ:特定の注釈を確認する

... 

trait Model 

case class User (name: String, age: Int, posts: List[String]) extends Model { 
    val numPosts: Int = posts.length 

    ... 

    def foo = "bar" 

    ... 
} 

だから、このコマンド

val myUser = User("Foo", 25, List("Lorem", "Ipsum")) 

myUser.asMap 

戻り

Map("name" -> "Foo", "age" -> 25, "posts" -> List("Lorem", "Ipsum"), "numPosts" -> 2) 

MapためTuple sが生成されている場所です(参照トラヴィス・ブラウンのanswer):

... 

val pairs = weakTypeOf[T].declarations.collect { 
    case m: MethodSymbol if m.isAccessor => 
    val name = c.literal(m.name.decoded) 
    val value = c.Expr(Select(model, m.name)) 
    reify(name.splice -> value.splice).tree 
} 

... 

今、私は@transient注釈を持つフィールドを無視したいと思います。メソッドに@transientアノテーションがあるかどうかを確認するにはどうすればよいですか?

私は

val pairs = weakTypeOf[T].declarations.collect { 
    case m: MethodSymbol if m.isAccessor && !m.annotations.exists(???) => 
     val name = c.literal(m.name.decoded) 
     val value = c.Expr(Select(model, m.name)) 
     reify(name.splice -> value.splice).tree 
} 

として上記のスニペットを変更すると思っていますが、私はexists一部で書くために必要なものを見つけることができません。 @transientAnnotationとしてどのように受け取ることができますか?

ありがとうございます!

答えて

11

アノテーションはアクセサーではなく、val自体に表示されます。今、あなたは自分のcollectに次のように書くことができ

def isTransient(m: MethodSymbol) = m.accessed.annotations.exists(
    _.tpe =:= typeOf[scala.transient] 
) 

isTransientのバージョンはI与えてくれたことを

case m: MethodSymbol if m.isAccessor && !isTransient(m) => 

valMethodSymbolaccessed方法であるにアクセスする最も簡単な方法ここではマクロ内で定義しなければなりません。なぜなら、それはc.universeからのインポートを必要としますが、いくつかのマクロでこのようなことをしているのなら、Universe引数を追加することで、

+1

もう一度おねがいします!私は注釈を得ることができない。上記の例のクラスで 'name'と' numPosts'の前に '@ transient'を追加しましたが、それらはまだマップに追加されています。不思議なことに、 'isTransient'を通過したメソッドのどれもが利用可能なアノテーションを持っていないようです。 「m.accessed.annotations」と「m.annotations」の両方が空です。 – Emre

+1

これは非常に奇妙です。どちらの場合でも期待通りに動作します。おそらく正確なコードを投稿できますか? –

+0

[code](http://pastebin.com/PmW5qg3P)はこちらです。ここでは、ここで少し異なるものを構築していることに注意してください - 指定されたパッケージのすべてのフィールドとフィールド・タイプのケース・クラスのマップ。問題はWeakTypeTagを持たないのですか?前もって感謝します。 – Emre

関連する問題