如何操作注释宏中的修饰符

How to manipulate modifiers in annotation macros

如何操作修饰符? 例如,我想在 ClassDef 修饰符中排除 Flaga.CASE。 但是,以下会导致编译错误。

case q"$mods class $name [..$tp](..$vals) extends ..$exts { ..$defs }" if mods.hasFlag(Flag.CASE) =>
       val m = mods - Flag.CASE
       q"$m class $name [..$tp](..$vals) { ..$defs }"

错误是

[error] ...: value - is not a member of c.universe.Modifiers
[error]         val m = mods - Flag.CASE
[error]                      ^
[error] one error found

好的,修饰符 api 没有 - 来排除指定的元素(如果存在的话,我希望这个方法像 Set 的 - 一样工作)。

我的问题是,正如我上面提到的,有没有一种方法可以操纵修改器?

尝试

import c.universe._

implicit class ModifiersOps(left: Modifiers) {
  def & (right: FlagSet): Modifiers = left match {
    case Modifiers(flags, privateWithin, annots) => Modifiers(flags & right, privateWithin, annots)
  }
}

implicit class FlagSetOps(left: FlagSet) {
  def & (right: FlagSet): FlagSet = (left.asInstanceOf[Long] & right.asInstanceOf[Long]).asInstanceOf[FlagSet]
  def unary_~ : FlagSet = (~ left.asInstanceOf[Long]).asInstanceOf[FlagSet]
}

annottees.head match {
  case q"${mods: Modifiers} class $name [..$tp](..$vals) extends ..$exts { ..$defs }" if mods.hasFlag(Flag.CASE) =>
    val m = mods & ~Flag.CASE
    q"$m class $name [..$tp](..$vals) { ..$defs }"
}