Макро-аннотация с параметрами по умолчанию
Получение параметров из аннотации макроса Scala объясняет, как получить параметры из аннотации макроса. Однако, если у меня есть несколько параметров со значениями по умолчанию:
class Foo(b: Boolean = false, i: Int = 0) extends StaticAnnotation { ... }
Мне нужно написать (основываясь на ответе на этот вопрос)
val (b, i) = c.prefix.tree match {
case q"new Foo(..$args)" => ???
}
Логика в ???
кажется очень неприятным: мне нужно обрабатывать как позиционные, так и именованные параметры, нет простого доступа к значениям по умолчанию и т. д. Есть ли способ упростить это?
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)"))
}