Dank der Antworten auf my previous question konnte ich ein Funktionsmakro so erstellen, dass es eine Map
zurückgibt, die jeden Feldnamen auf seinen Wert einer Klasse abbildet, z.Scala-Makros: Überprüfung auf eine bestimmte Annotation
...
trait Model
case class User (name: String, age: Int, posts: List[String]) extends Model {
val numPosts: Int = posts.length
...
def foo = "bar"
...
}
So dieser Befehl
val myUser = User("Foo", 25, List("Lorem", "Ipsum"))
myUser.asMap
kehrt
Map("name" -> "Foo", "age" -> 25, "posts" -> List("Lorem", "Ipsum"), "numPosts" -> 2)
Hier Tuple
s für die Map
erzeugt werden (siehe Travis Brown 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
}
...
Jetzt möchte ich Felder ignorieren, die @transient
Annotation haben. Wie würde ich prüfen, ob eine Methode eine @transient
Annotation hat?
Ich denke, das Snippet oben als
modifizierenval 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
}
aber ich kann nicht finden, was ich in exists
Teil schreiben müssen. Wie würde ich @transient
als Annotation
bekommen, damit ich es dort übergeben könnte?
Vielen Dank im Voraus!
Danke nochmal! Ich kann anscheinend keine Anmerkungen erhalten. Ich habe '@ transient' vor 'name' und' numPosts' in der obigen Beispielklasse hinzugefügt, aber sie werden immer noch zur Karte hinzugefügt. Seltsamerweise scheint keine der Methoden, die "isTransient" durchlaufen hat, irgendwelche Anmerkungen verfügbar zu haben. Sowohl "m.accessed.annotations" als auch "m.annotations" sind leer. – Emre
Das ist sehr seltsam - es funktioniert für mich wie erwartet in beiden Fällen. Kannst du vielleicht deinen genauen Code posten? –
Hier ist der [code] (http://pastebin.com/PmW5qg3P). Beachten Sie, dass ich hier etwas etwas anderes baue - eine Karte aller Felder und Feldtypen von Fallklassen unter einem gegebenen Paket. Hat das Problem keinen WeakTypeTag? Danke im Voraus. – Emre