2016-06-17 3 views
2

Getting Parameters from Scala Macro Annotation объясняет, как получить параметры из аннотации макроса. Тем не менее, если у меня есть несколько параметров со значениями по умолчанию:Макро-аннотация с аргументами по умолчанию

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

Мне нужно написать (на основе ответа на этот вопрос)

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

Логика в ???, кажется, становится очень противно: мне нужно для обработки как позиционных, так и именованных параметров, простого доступа к значениям по умолчанию и т. д. Есть ли способ упростить его?

+0

Пока что нет лучшего способа, к сожалению. –

+0

Если вам нужно получить значения параметров, это работает: http://stackoverflow.com/a/42961043/3669757 – eje

ответ

1

Ну, это ограниченное решение, но

// 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)")) 
} 
Смежные вопросы