Scala 如何在注释宏中操作修改器

Scala 如何在注释宏中操作修改器,scala,annotations,scala-macros,Scala,Annotations,Scala Macros,如何操作修改器? 例如,我想在ClassDef修饰符中排除Flaga.CASE。 但是,以下操作会导致编译错误 case q“$mods class$name[..$tp](..$vals)扩展了..$exts{..$defs}”,如果mods.hasFlag(Flag.case)=> val m=mods-Flag.CASE q“$m class$name[..$tp](..$vals){..$defs}” 错误是 [error] ...: value - is not a member o

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

case q“$mods class$name[..$tp](..$vals)扩展了..$exts{..$defs}”,如果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 }"
}

很抱歉,我的答复耽搁了。我发现了一个api,它允许我在
ModifiersApi
mapAnnotations
中操作修饰符。这个api使用lambda来操作修改器。但是,您的
modifierROPS
让我觉得修饰符并不是只有像
Flag.CASE这样的修饰符。因此,我不知道操作修饰符的更好方法。@BitMaPT
mapAnnotations
可以在
修饰符(标志、私有范围、注释)中更改
annots
。如果要更改
标志
,可以解构construct
修饰符
或使用我的扩展方法。