Макро-аннотация с параметрами по умолчанию

Получение параметров из аннотации макроса 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)"))
}
Другие вопросы по тегам