2016-06-17 17 views
2

Getting Parameters from Scala Macro Annotation erläutert, wie Parameter von einer Makroannotation abgerufen werden. Allerdings, wenn ich mehrere Parameter mit Standardwerten haben:Makroannotation mit Standardargumenten

class Foo(b: Boolean = false, i: Int = 0) extends StaticAnnotation { ... } 

brauche ich (auf der Grundlage der Antwort auf diese Frage)

val (b, i) = c.prefix.tree match { 
    case q"new Foo(..$args)" => ??? 
} 

Die Logik in ??? zu schreiben scheint sehr böse zu werden: Ich brauche um sowohl positionale als auch benannte Parameter zu handhaben, keinen einfachen Zugriff auf die Standardwerte usw. Gibt es eine Möglichkeit, es zu vereinfachen?

+0

Bisher gibt es keinen besseren Weg, leider. –

+0

Wenn Sie die Werte der Parameter abrufen müssen, funktioniert dies: http://Stackoverflow.com/a/42961043/3669757 – eje

Antwort

1

Nun, das ist eine begrenzte Lösung, aber

// same constructor parameters and defaults as Foo 
class FooArgs(b: Boolean = false, i: Int = 0) 

val args = c.prefix.tree match { 
    case q"new Foo(...$args)" => c.eval(c.Expr[FooArgs](q"new some_package.FooArgs(...$args)")) 
}