带有默认参数的宏注释

时间:2016-06-17 23:45:48

标签: scala scala-macros scala-macro-paradise

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)" => ???
}

???中的逻辑似乎变得非常讨厌:我需要处理位置和命名参数,不需要简单访问默认值等等。有没有办法简化它?

1 个答案:

答案 0 :(得分:2)

嗯,这是一个有限的解决方案,但

// 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)"))
}